思路
由于凯撒加密法有“回调”效果,仿射加密法也有。
凯撒加密法受符号集大小的因素,同理仿射加密法也是,可以写个小程序验证。
得出结论: 如果符号集大小是95 那么密钥可能有就是95*95=9025种(未减去不互质数),
如果减去不能用的密钥,剩下数字是7125.
已知可能密钥数,进行暴力破解
代码实现
# 验证仿射加密法“回调”效果程序
def affineKeyTest():
import affineCipher
message = 'Make things as simple as possible, but not simpler.'
# 由于0和1不是有效密钥A,所以在2~100尝试
for keyA in range(2, 100):
key = keyA * len(affineCipher.SYMBOLS) + 1
# 如果不互质则跳过
if affineCipher.gcd(keyA, len(affineCipher.SYMBOLS)) == 1:
print(keyA, affineCipher.encryptMessage(key, message))
# 调用仿射加密法的 gcd判断 和破译换位加密法的英语单词判断
import affineCipher, transpositionHacker
def hackAffine(message):
print('Hacking...')
# 直接尝试字典大小的平方数大小
for key in range(len(affineCipher.SYMBOLS) ** 2):
# 将密钥分成A、B 并取出KeyA进行互质判断
keyA = affineCipher.getKeyParts(key)[0]
# 进行密钥A判断是否互质 如果不互质直接下一个循环
if affineCipher.gcd(keyA, len(affineCipher.SYMBOLS)) != 1:
continue
# 尝试解密
decryptedText = affineCipher.decryptMessage(key, message)
print('Tried Key %s... (%s)' % (key, decryptedText[:40]))
# 如果解密判断有英文单词 则判断其可能是正确密钥
if transpositionHacker.isEnglish(decryptedText):
print()
print('Possible encryption hack:')
print('Key: %s' % (key))
print('Decrypted message: ' + decryptedText[:200])
print()
return decryptedText
return None
def main():
myMessage = """U&'<3dJ^Gjx'-3^MS'Sj0jxuj'G3'%j'<mMMjS'g{GjMMg9j{G'g"'gG'<3^MS'Sj<jguj'm'P^dm{'g{G3'%jMgjug{9'GPmG'gG'-m0'P^dm{LU'5&Mm{'_^xg{9"""
hackedMessage = hackAffine(myMessage)
if hackedMessage != None:
print(hackedMessage)
else:
print('Failed to hack encryption.')
if __name__ == "__main__":
# affineKeyTest()
main()
结果
截取一部分