python解密《御赐小仵作》反切注韵法
【摘要】 @TOC 自来水的自述今天也来当把【自来水】,一开始我对这部剧是没什么想法的,但架不住这部剧频频在我眼前刷屏,多次上热搜也就算了,朋友圈、豆瓣、微博、常看的一些大佬公众号还能经常看到安利。对于不怎么看视频的我来说,也就记着个名字,并没有去刷的欲望,上周末闲来无事,找个下饭视频就又想起来这个了,刚好也在腾讯首页推荐,打开之后,一发不可收拾,熬夜通宵追剧,一个周末淦完了!难怪豆瓣评分足足冲到了 ...
@TOC
自来水的自述
今天也来当把【自来水】,一开始我对这部剧是没什么想法的,但架不住这部剧频频在我眼前刷屏,多次上热搜也就算了,朋友圈、豆瓣、微博、常看的一些大佬公众号还能经常看到安利。
对于不怎么看视频的我来说,也就记着个名字,并没有去刷的欲望,上周末闲来无事,找个下饭视频就又想起来这个了,刚好也在腾讯首页推荐,
打开之后,一发不可收拾,熬夜通宵追剧,一个周末淦完了!难怪豆瓣评分足足冲到了 8.4 分,口碑在同期播出的古装剧中达到最佳。个人觉得长大后看的最出彩的一部剧了!
还是个“三无”网剧:
- 没有大腕明星的卡司,
- 没有铺天盖地的宣发,
- 甚至成本经费都有些“寒酸,
故事逻辑异常严禁,没有把观众当傻*,文学素养让我一度认为我是九年义务教育漏网之鱼
,其他的自行看剧体验吧,今天想讲一下21集,小金鱼解密驸马的密信的情节——基于python实现反切注韵法的中国式密码学
反切注韵法解密
毕竟也曾是个国学爱好者,看剧时候,第一次听到反切注韵法,我就知道我不配了,一顿百度猛如虎,先上链接解释下什么是反切注韵法
,毕竟不是国学科普,这里就不复制了,感兴趣的直接跳链接吧
下面进入正题之前还需要先了解一个库python的拼音库:
# 安装库-拼音库和去除中文标点符号的库
!pip install pypinyin -ihttps://pypi.tuna.tsinghua.edu.cn/simple
!pip install zhong -ihttps://pypi.tuna.tsinghua.edu.cn/simple
# 先导入母本诗词
m1 = "桃花口,静水旁,幼子垂丝,微澜皱,媚娘采荇,清波荡,染浮光。"
m2 = "春花渐谢夏叶宽,月沉横桥饵光庞。渭水怀秋,无尽秋愁泊云来。灞陵伤别,多少相思烟雨中。淦,饿,冤,北,永"
# 这里说明下,网上说这里是华点,密码对不上,道具是随便弄的,这个我没去深究,毕竟还有扬州码子,还要截图密文太麻烦,
# 这不重要,主要是解密过程中缺少韵母:an,e,van,ei,iong
# 所以我在后面增加了几个字
# 有意思的是,百度中又了解到一个知识盲点,三合复韵母,有兴趣的自行百度
# 导入库
from pypinyin import pinyin
# 去除中文标点符号
import re,string
from zhon.hanzi import punctuation
# 古文是无标点的,为了方便阅读加了标点,这里再去除掉
m1_ = re.sub(r"[%s]+" %punctuation,"",m1)
m2_ = re.sub(r"[%s]+" %punctuation,"",m2)
# 由于前文提到这里的道具是凑的,就不解析剧中密码本了
# 这里我把驸马密信的内容给扣下来了,做一个反向解析,即由密信内容解析出原来的密码数字
def get_paswd_info(sentence):
"""解析母本拼音信息"""
# 用于存储解析后的声母
shm_list = []
# 用于存储解析后的带声调的韵母
ym_list = []
# 用于存储解析后的不带声调的韵母
ym_list_only = []
for word in sentence:
# 声母解析
s = pypinyin.pinyin(word,style=pypinyin.INITIALS)[0][0]
shm_list.append(s)
# 带声调的韵母解析 - 带声调,声调在各个拼音之后,用数字 [1-4] 进行表示
y = pypinyin.pinyin(word,style=pypinyin.FINALS_TONE3)[0][0]
ym_list.append(y)
# 不带声调的韵母解析
y_ = pypinyin.pinyin(word,style=pypinyin.FINALS)[0][0]
ym_list_only.append(y_)
return shm_list,ym_list,ym_list_only
# 密信内容
info = """吾名萧恒,乃文宗朝监察御史,今留此密文,望后世饱学而无畏之士,解鬼宅之谜、破残局,得吾自沉之地,使此沉冤得见天日,还剑南忠义之魂以清白之名。
太和九年,文宗帝欲根除北司之祸,吾奉密旨宣剑南节度使陈璎,领兵入京策应,陈璎接旨即行,却不料甘露事败,宦党挟天子而屠群臣,陈璎一众义师被诬谋反。
吾携密旨突围,却遭围堵重伤,不得已跳崖以求死地后生。
幸得一采药巫医相救,然昏迷月余,苏醒之时已无力回天,宦党更是借圣谕,以英烈之名与郡王爵位相加,欲诱吾现身,取吾命以灭证据,吾唯恐一步踏错,非但洗冤无望,反牵连更多无辜,无奈之下在巫医染病西归后,承其衣钵,藏居于关岭县平乐镇以图后事。
幸得仵作楚家照拂,吾一日不敢忘身负之重托,然关岭县地势险要,与外界相通者唯有一滑索,宦党势力于西南之搜捕从未停歇,吾双腿已废,不良于行,县中官员又频对潜逃于此之剑南节度使余众,痛下杀手,吾始终未得机会与长安联络。
后有宦官独自追查至吾隐居处。吾侥幸杀之,藏其尸首与凶器于院中墙内,以为存证。
奈何残躯病体每况愈下,时日无多,虽心有不甘,却唯能做此安排。
吾写此书自沉泥沼,以天地为棺,藏沉冤以期后人明法"""
# 同样地,对密信内容做去除中文标点符号处理
info_ = re.sub(r"[%s]+" %punctuation,"",info).replace("\n","")
# 由母本(前面的两首诗)解析出密文的声母和不带声调的韵母
mw_shm = get_paswd_info(m1_)[0]
mw_ym = get_paswd_info(m2_)[2]
def creat_mw_num(info,mw_shm,mw_ym):
"""构造解析后的密文数字"""
first_num = []
shm = get_paswd_info(info)[0]
for i in shm:
if i:
# 在密文声母中搜索位置
first_num.append(mw_shm.index(i))
else:
# 这里没有声母的使用0代替
first_num.append(0)
second_num = []
ym = get_paswd_info(info)[2]
for j in ym:
#在密文韵母中搜索位置
second_num.append(mw_ym.index(j))
third_num = []
sd = get_paswd_info(info)[1]
for k in sd:
# 解析后的声调1-4
third_num.append(k[-1])
# 使用zip进行压缩解包
return list(zip(first_num,second_num,third_num))
# 输入密信,和密文声母韵母————》得到驸马密信的实际密文
creat_mw_num(info_,mw_shm,mw_ym)
解析后的密码如下图所示
# 生成用于测试的密码
message = "几多轮回少一人轮回几多到凡尘"
creat_mw_num(message,mw_shm,mw_ym)
def send_message(num_info,mw_shm,mw_ym):
"""密码转信息"""
info = []
for num in num_info:
info.append(mw_shm[num[0]]+mw_ym[num[1]]+num[2])
return info
# 用前面生成的测试密码测试
num_info = [(3, 32, '3'), (19, 29, '1'), (11, 0, '2'), (1, 14, '2'), (4, 30, '3'), (0, 32, '1'), (20, 8, '2'), (11, 0, '2'),
(1, 14, '2'), (3, 32, '3'), (19, 29, '1'), (19, 30, '4'), (21, 36, '2'), (8, 8, '2')]
send_message(num_info,mw_shm,mw_ym)
# 运行结果如下图所示
写在最后
综上所述,外加后面解析《诗经》密信时的凡尔赛发言,小金鱼绝对是个移动的计算机,可能是未来机器人穿越回去的,哈哈哈、、、、、这记忆力,计算力,人力有时穷啊!!!!
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)