我正在写一个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']

随着人们对这一问题的关注,人们对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识是一个问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和对这一问题的认识和认识,这一问题的认识和认识,这一问题的认识和这一问题,这一问题的认识和这一问题的认识是一问题的价值观,这一问题是一问题的认识和做一问题的认识是的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 eo qm 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 pz dm vqVO VK PR KZ反渗透

最佳答案

应用于加密的Hillclimbing算法原理如下:
随机制作一个键(在ramdom制作一个25个字符的字母表),并用你的有向图评分来确定适合性。称之为“家长”
对父项进行一些更改以生成“子”密钥(5x5网格密钥表中的随机交换并不是很糟糕),并使用有向图评分函数测量其适合性。
如果孩子比父母更健康,就让孩子
新父母与旧父母
回到(2),除非在过去1000年中没有任何改进
在这种情况下,更改返回(1)
这是避免在有向图评分函数的局部最大值中被阻塞的方法。
如果你想得到比hillclimbing更好的结果,你必须开发一个模拟退火算法。此外,基于三角或4克的评分函数具有较小的局部最大值。
如果你想更快地破解它,你可以从Python移动到C/C++。
hillclimbing和模拟退火算法可以用来破解playfair密码以及所有其他基于5×5网格的密码,也可以用来破解简单的替换密码和vigener密码。
PlayFair密码的一个重要特点是它很弱:5x5网格的所有圆形水平或垂直排列都是等价的密钥。所以这个密码的算法收敛速度更快。
要使父字母表使用以下内容:

alpha='ABCDEFGHIKLMNOPQRSTUVWXYZ'
used=[0]*25;parent=['']*25
for i in range(25):
    j=randrange(25)
    while used[j]:j=randrange(25)
    parent[i]=alpha[j];used[j]=1

游乐场解密功能:
def DEplayfair(a,key):
l=[];order={}
for k in range(25):order[key[k]]=k
for i in range(0,len(a),2):
    ord1=order[a[i]]
    raw1=ord1//5
    col1=ord1%5
    ord2=order[a[i+1]]
    raw2=ord2//5
    col2=ord2%5
    if raw1==raw2:
        l.append(key[5*raw1 + (col1 + 4)%5])
        l.append(key[5*raw2 + (col2 + 4)%5])
    elif col1==col2:
        l.append(key[col1 + 5*((raw1 + 4)%5)])
        l.append(key[col2 + 5*((raw2 + 4)%5)])
    else:
        l.append(key[5*raw1 + col2])
        l.append(key[5*raw2 + col1])
return ''.join(l)

对于sa-algos,您可以在中找到sa的基本原理:
http://en.wikipedia.org/wiki/Simulated_annealing
游乐场密码在二战期间被美国海岸警卫队使用,有一个著名的历史游乐场密码:
http://practicalcryptography.com/ciphers/playfair-cipher/
PS:在你的PlayFair密码示例中,主角的名字是爱丽丝。

10-06 06:48