思路
由於凱撒加密法有“回調”效果,仿射加密法也有。
凱撒加密法受符號集大小的因素,同理仿射加密法也是,可以寫個小程序驗證。
得出結論: 如果符號集大小是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()
結果
截取一部分