Python:将Cesar密码转换为仿射密码

时间:2016-02-28 04:19:57

标签: python encryption caesar-cipher

我应该将这个Cesar Cipher转换为仿射密码,但不幸的是似乎无法弄明白。

最终我应该将给定的Cesar Cipher代码转换为仿制密码,该密码解密由26个小写字母{a,b,c,...,x,y,z}组成的任何字符串密文。这是通过强力搜索,尝试所有可能的密钥并输出加密密钥k =(a,b)和相应的纯文本。当解密“可理解的”纯文本消息时,该程序应该停止。

任何帮助我指向正确方向的人都将不胜感激。

这是Cesar Cipher代码:

def caeser (s, k):
    y = ""
    for x in s:
        c = ((ord(x) - ord("a")) + k) % 26
        y = y + chr(ord("a") + c)
    return y

def topLetter(s):
    count = [0]*26
    for x in s:
        x_index = (ord(x) - ord("a"))
        count[x_index] += 1
    lcount = 0
lchar = ""
for i in range(26):
    if count[i] > lcount:
        lcount = count[i]
        lchar = chr(i + ord('a'))
return lchar

def findShift(s):
    return(ord(topLetter(s)) - ord("e"))

cipher = "vwduwljudeehghyhubwklqjlfrxogilqgsohdvhuhwxuqdqbeoxhsulqwviruydxowdqgdodupghvljqedvhgrqzklfkedqnbrxghflghrqldpvhwwlqjxsvdihkrxvhfr"
print("Deciphering:'", cipher +"'")

print("\nBrute Force")
shift = 1
while shift < 26:
    ptext = caeser(cipher, -1*shift)
    print()
    print("Plaintext message when encryption key =", shift)
    print(ptext)
    shift += 1

这是一些示例输出,以帮助你们。

Decrypting the cipher text: 'vwduwljudeehghyhubwklqjlfrxogilqgsohdvhuhwxuqdqbeoxhsulqwviruydxowdqgdodupghvljqedvhgrqzklfkedqnbrxghflghrqldpvhwwlqjxsvdihkrxvhfr'

Encryption key: a = 1 b = 1
Decryption equation: x = 1 *(y - 1)

Plaintext:
uvctvkitcddgfgxgtavjkpikeqwnfhkpfrngcugtgvwtpcpadnwgrtkpvuhqtxcwnvcpfcnctofgukipdcugfqpyjkejdcpmaqwfgekfgqpkcougvvkpiwruchgjqwugeq

Hit enter to continue search or 'S' key to stop: 
Encryption key: a = 3 b = 1
Decryption equation: x = 9 *(y - 1)

Plaintext:
yhsphmupsbbctczcpahdmfumkoqntlmftxncsycpchqpfsfabnqcxpmfhylopzsqnhsftsnspwtcymufbsyctofidmkdbsfeaoqtckmtcofmswychhmfuqxyslcdoqycko

Hit enter to continue search or 'S' key to stop: 
Encryption key: a = 5 b = 1
Decryption equation: x = 21 *(y - 1)

1 个答案:

答案 0 :(得分:0)

你已经拥有的凯撒密码强力解算器和你需要用强制性密码写入的东西之间存在两个主要的区别。

第一个变化是仿射密码的密钥是两个整数(通常命名为ab),而不是caesar密码中的单个值。 (a等于1的仿射密码相当于带有密钥b的casear密码。)用作a的值必须与字母长度相互作用,对于26个小写字母,它意味着它必须是1到25之间的奇数(除了13之外)。b值就像凯撒密码的关键,所以任何整数都可以工作,但是密码的计算使用模运算,相差的字母长度的倍数相等。对于使用小写字母操作的代码,我会坚持0到25之间的值。你的暴力代码需要生成密钥的两个部分(可能有嵌套循环,尽管itertools.product也可以工作)。

第二个变化是,使用仿射密码反转加密以获得解密更加复杂。虽然caesar密码的decrpytion密钥只是加密密钥被否定,但是解析密码版本时仿射密码的密钥需要更多的计算。如果您使用密钥(ab)进行加密,则需要使用密钥(a -1 -b * {进行解密{1}} -1 ),其中a -1 a相对于字母大小的modular multiplicative inverse。您可能希望编写代码来为求解器计算这样的逆,尽管您可以强制解密密钥而不关心最初使用的加密密钥。