破译仿射加密法

思路

由于凯撒加密法有“回调”效果,仿射加密法也有。
凯撒加密法受符号集大小的因素,同理仿射加密法也是,可以写个小程序验证。
得出结论: 如果符号集大小是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()

结果

截取一部分
运行结果

发布了33 篇原创文章 · 获赞 3 · 访问量 1828

猜你喜欢

转载自blog.csdn.net/youngdianfeng/article/details/104418898