我正在编写一个 python 脚本来破解一个 playfair 密码,只有密文。首先,我生成大约 30-100 个解密密钥并在密文上运行它们,根据它的有向图频率对每个密钥进行排名。到下一代“/迭代”,我复制得分最高的那些。然后它们被变异(字母在 5x5 网格中交换位置)并重新添加到下一次迭代中,再次进行排名,依此类推。
我注意到脚本经常找到一个局部最大值——一个给出类似分布的键,但不是真正的交易。我认为解决该问题的方法是为密钥的数量引入更多变化(在脚本结束时,它们几乎都相同)。
我试图通过向每一代添加几个完全随机的密钥来实现它,但它们几乎立即被淘汰。有什么更好的方法呢?我也想过模拟退火之类的策略,但不知道它们会有多大帮助。
编辑:按要求提供示例密文(关键:playfair 示例)
['p', 'l', 'a', 'y', 'f']
['i', 'r', 'e', 'x', 'm']
['b', 'c', 'd', 'g', 'h']
['k', 'n', 'o', 'q', 's']
['t', 'u', 'v', 'w', 'z']
as el ir ul vine uz qk dm kz qe ca qe tb qc pv zb md nv om lo gv qo od er qc zg pv vk ov 或 iw zg ro nz ge ro af yp qe zi lo rk pr ad xl dl ix cl qr rk dq vu sa zb xv qe ho dm dn ok eb xe do bm iz kd de as kv ef kc rd lv om dm vy km ur et xe aq zb xe tx om rt gh rk hc fg mk py dr qo af zs xv nv ac df ad dl yr do bm ef pm zs lo ce yl ai ca nv ca fy wi dm ov ne tx zb bm kn ul bn ar km uz fo ka ro do gp lo kv dm ml qe zi lo rk pr ad xl tx zb le nv oc py dr lo ca le dx xa mo pr oi yp en dy oc dk zb as kv ix ol pr dr oq pb dr gb eo ak vg xe do df re zb pv nl cr do ya an ad iu dm re dm eo qm dm am pu ad xl nl er nv kz qn oq yg df pb uz fo ya ay dk vu lo gd ex ip ya bp up xv yf nv vk pz dm vq vo vk pr kz ro