2024-04-28 23:59:47 发布
网友
我如何解码一些像这样编码的文本:affine(vigenere(text, vigenere_key), *affine_key)?我都不知道它们的钥匙。起初我以为我可以尝试所有可能的组合,但后来我意识到破解Vigener是基于查找关键字,关键字可以是任何东西,而且破解Vigener后解码的消息没有任何意义,因为它仍然用仿射编码,我有点困惑如何找到Vigener的正确密钥并破解它
affine(vigenere(text, vigenere_key), *affine_key)
我想这不会回答你的问题,但我希望它能有所帮助。在你的情况下,如果你真的想破解这个密文,你可以尝试暴力破解仿射密码密钥(我希望暴力破解的时间复杂性不是很长)然后,对于每个解密的密文,您可以通过利用vignere Ciphere的属性来测试特定解密的密文是否具有额外的Vigener加密层,并保留纯文本语言的一致性索引的痕迹,该索引可用于猜测解密的密文是否有点像英语(除替换字母外)虽然这只能在Vigenene密钥较短(约5或6个字符)的情况下起作用。但在有一个有前途的候选人之后,您可以使用蛮力来破解Vigenene密钥
这段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对每一个解密的密文都可以进行一些简单的尝试,但如果仿射密码密钥较大,则会变得复杂,最好在使用暴力之前使用上述代码来测试它是否可能是英文候选密码
5
7893600 = 26*25*24*23*22
我想这不会回答你的问题,但我希望它能有所帮助。在你的情况下,如果你真的想破解这个密文,你可以尝试暴力破解仿射密码密钥(我希望暴力破解的时间复杂性不是很长)然后,对于每个解密的密文,您可以通过利用vignere Ciphere的属性来测试特定解密的密文是否具有额外的Vigener加密层,并保留纯文本语言的一致性索引的痕迹,该索引可用于猜测解密的密文是否有点像英语(除替换字母外)虽然这只能在Vigenene密钥较短(约5或6个字符)的情况下起作用。但在有一个有前途的候选人之后,您可以使用蛮力来破解Vigenene密钥
这段python代码计算符合的索引,并尝试猜测键的长度
请注意,对于较小的密钥长度,中断vigenere密钥的预期时间复杂度不会很大,例如
5
个字符的密钥长度将为7893600 = 26*25*24*23*22
对每一个解密的密文都可以进行一些简单的尝试,但如果仿射密码密钥较大,则会变得复杂,最好在使用暴力之前使用上述代码来测试它是否可能是英文候选密码相关问题 更多 >
编程相关推荐