破譯仿射加密法

思路

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

結果

截取一部分
運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章