如何解码编码如下的文本:affine(vigenere(text, vigenere_key), *affine_key)
?我都不知道它们的钥匙。起初我以为我可以尝试所有可能的组合来破解它,但后来我意识到破解Vigenere是基于找到关键字,关键字可以是任何东西,由于破解Vigener后解码的消息没有任何意义,因为它仍然用Affine编码,我有点困惑如何找到Vigenere的正确密钥并破解它?
我想这不会回答你的问题,但我希望它能有所帮助。在你的情况下,如果你真的想破解这个密文,你可以尝试暴力破解仿射密码密钥(我希望暴力破解的时间复杂度不会很长(,然后对于每一个解密的密文,你都可以通过利用vignere密码的特性来测试特定的解密密文是否有额外的vigenere加密层,保持索引的痕迹明文语言的巧合,可以用来猜测解密后的密文是否有点像英语(字母被替换除外(,尽管这只能在vigenere密钥较短(大约5或6个字符(的情况下起作用。然后在有了一个有前途的候选人之后,你可以使用蛮力破解vigenere密钥。
此python代码计算一致性索引,并尝试猜测密钥长度。
def index_of_coincidence(ciphertext: str) -> float:
alphabet = "qwertyuioplkjhgfdsazxcvbnm"
ciphertext = ciphertext.lower()
ciphertext_length = 0
for char in ciphertext:
if char in alphabet:
ciphertext_length += 1
lc = 0
denomiator = (ciphertext_length * (ciphertext_length-1))
for char in alphabet:
letter_count = ciphertext.count(char)
lc += (letter_count * (letter_count-1)) / denomiator
return lc
def vigenere_key_length(ciphertext: str) -> int:
lc_ranges = ["x", 0.0639, 0.0511, 0.0468, 0.0446, 0.0438, 0.0426]
lc = index_of_coincidence(ciphertext)
print(lc)
if lc >= lc_ranges[1]:
print("The Key length is probably {}".format(1))
key = 1
return key
key = 1
for key_length in range(1, 6):
if key_length == 6:
print("Cant determine Key length with accuracy")
return None
if lc_ranges[key_length] >= lc >= lc_ranges[key_length + 1]:
key += key_length
break
print("The Key Length is probably {}".format(key))
return key
注意,对于较小的密钥长度,破解vigenere密钥的预期时间复杂度不会很大,例如,5
字符的密钥长度将是7893600 = 26*25*24*23*22
次尝试,这对于每个解密的密文来说都可以很容易地完成,但如果仿射密码密钥很大,则会变得复杂,因此最好在之前使用上述代码来测试它是否是可能的英文候选暴力。