Python算法设计 - 编码加密

一、编码加密

编码加密应用十分广泛,特别是在大数据时代,也因此信息安全变得尤为重要

有时我会读到“OTP是一种无法被破解的加密方式”,当然,文末会附上一个完全被破解的OTP加密的例子

问题在于,人们经常会觉得完美的加密方式就是不可破解的加密方式,如果密码是完美的(根据香农定理),则从不同的明文获得密文实例的概率分布必须是均匀的,换句话说,给定一些密码文本,任何纯文本都有相同的机会成为源

这样的话,即使是计算能力再厉害的对手也无法从纯密码文本中获取任何关于纯文本的信息

但这远不是牢不可破的,即使正确的使用OTP也很容易损坏,设想一家银行用OTP对数字支票进行加密,在众所周知的支票处重写100.0美元-999.99美元有多容易?

OTP是完美的密码?其实在大多数实现方式下不是的。当人们强调密钥的单一使用时,他们也会忘了密钥分配的一致性,这往往也是非常重要的

当我生成信息的时候,我违反了一次性规则,那么后果是不可避免的

二、Python算法实现


ciphertext = [
    b'm\x99QH\xfc\x99\xcel\xfc>\x11\xf81\xda:\x15"6\xd3b\x07\x7f\xed\x87\xd5\xd4\xf0\xbb',
    b'x\x96^\r\xb5\x83\x86u\xeel\x0e\xf8,\xce:\x06 6\xd0b\nx\xfd\x87\xd9\xc9\xe8',
    b'm\x90O^\xfc\x80\xd3f\xe7>\x16\xf46\x89w\x05r8\xcb-\x04',
    b'`\x97O\r\xbd\x9f\xc3%\xe1q\x0e\xb15\xdbu\x0e5y\xca*\x1c7\xec\xc2\xd2\xcb',
    b"m\x90[Y\xfc\x80\xdf%\xeb\x7f\x03\xe2b\xc1{\x167y\xdf'\x16y\xa8\xc6\x97\xc2\xed\xa9p(",
    b'`\x9dN\r\xb5\x8b\x86m\xe0n\x1f\xb1*\xc8i@45\xd25\x1d7\xe9\xd0\xd6\xdf',
    b'p\x96\x1aL\xfc\x83\xcfb\xe7jZ\xfe0\x89s\x0er8\x9d&\x12n',
    b'p\x96\x1aL\xfc\x9b\xcfv\xe6q\x14\xb1-\xdb:\t<y\xd3-\x1dr',
    b'p\x8b\x1aD\xa8\xcd\xd2m\xeal\x1f\xf7-\xdb\x7f@&1\xd8b\x1fr\xfb\xd4\x97\xc1\xf0\xa2t',
    b'x\x94V\r\xa8\x85\xc7q\xafi\x1f\xb11\xcc\x7f@=+\x9d1\x16r\xe5',
    b'p\x8b\x1aO\xa9\x99\x86d\xafz\x08\xf4#\xc4:\x17;-\xd5+\x1d7\xe9\x87\xd3\xd4\xfa\xad|',
    b'p\xd8IY\xbd\x83\xc2%\xees\x13\xf5b\xddr\x05r+\xd2#\x01',
    b'v\x9e\x1aL\xfc\x9e\xd3w\xe9>\x0e\xfe0\xc4\x7f\x0e&<\xd9b\x00\x7f\xe7\xd5\xd2',
    b'x\x96^\r\x95\xcd\xcej\xe3zZ\xe6+\xddr\t<y\xd0;S\x7f\xe9\xc9\xd3',
    b"~\x8a[D\xb2\x9e\x86j\xe9>\x0e\xf9'\x89}\x0f>=\xd8,Sd\xe9\xc9\xd3",
    b'q\x97M\r\xba\x88\xd1%\xf6{\x0e\xb1*\xc6m@&1\xd8;St\xfa\xc2\xd2\xd6',
    b'm\x90HB\xa9\x8a\xce%\xe2gZ\xf7+\xc7}\x05 *\x9d6\x1c7\xfc\xcf\xd2\x86\xfb\xa9t5',
    b'n\x90SA\xb9\xcd\xcf%\xf8{\x1f\xe1b\xder\t><\x9d\x0bS`\xed\xc2\xc7',
    b'9\xd8_I\xbb\x8c\xd4%\xeer\x16\xf0,\x89j\x0f7y\x9dbS7\xa8\x87\x97\x86\xbf',
]

from string import ascii_lowercase      #ASCII字符

# 允许字符集
letters = set(ascii_lowercase + ' ')

# 重构消息
plaintext = [''] * len(ciphertext)

# 把所有代码放在同一位置
for messages in zip(*ciphertext):
    keys = set()

    # 找到可行密钥
    for key in range(256):
        for m in messages:
            if chr(m ^ key) not in letters:
                break
        else:
            keys.add(key)

    key = keys.pop() if len(keys) == 1 else None

    # 重构明文
    for i, m in enumerate(messages):
        if key is not None:
            plaintext[i] += chr(m ^ key)
        else:
            plaintext[i] += '?'

print(plaintext)
  • chr(i)函数返回整数i对应的ASCII字符,与ord()作用相反,参数取值范围[0,255]之间的正数。该函数在python2和python3各个版本中都可用。不存在兼容性问题
  • key = keys.pop() if len(keys) == 1 else None是Python中高级且高效的写法,也可写成:

if len(keys) == 1:
    key = keys.pop()
else:
    key = None

类似于 x**2 for x in range(10),那么这种写法也可写为:


def multi(x):
    for x in range(10):
        x = x**2

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出元素下标和元素,一般用在 for 循环当中。

猜你喜欢

转载自blog.csdn.net/qq_44000141/article/details/130373266