Python算法设计 - 编码加密

文章讨论了OTP(一次性密码)加密的安全性,指出即使OTP在理论上是完美的,但在实际应用中,如银行数字支票加密,仍存在被破解的风险。此外,文章通过Python代码展示了如何解析和解密特定的加密文本,强调了密钥管理和分配在加密系统中的重要性。
摘要由CSDN通过智能技术生成

一、编码加密

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

有时我会读到“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 循环当中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒青椒不放辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值