Diseño de algoritmos de Python - Codificación y cifrado

1. Codificación y Cifrado

El cifrado de codificación se usa ampliamente, especialmente en la era de los grandes datos, por lo que la seguridad de la información se ha vuelto particularmente importante. A veces

leo "OTP es un método de cifrado que no se puede descifrar", por supuesto, se adjuntará uno completamente descifrado al final. del artículo El problema con el ejemplo del cifrado OTP

es que las personas a menudo sienten que un cifrado perfecto es un cifrado indescifrable, y que si el cifrado es perfecto (según el teorema de Shannon), entonces la distribución de probabilidad de obtener instancias de texto cifrado de diferentes textos sin formato debe ser uniforme, en otras palabras, dado un texto cifrado, cualquier texto sin formato tiene las mismas posibilidades de ser la fuente. De esta

manera, incluso un adversario computacionalmente poderoso no puede aprender nada sobre el texto sin formato del texto cifrado sin formato.

Pero esto está lejos de ser indescifrable. Sí , las OTP se corrompen fácilmente incluso cuando se usan correctamente, imagine un banco que encripta cheques digitales con OTP, ¿qué tan fácil sería reescribir $ 100.0 - $ 999.99 en un cheque proverbial?

¿Es OTP el cifrado perfecto? En la mayoría de las implementaciones no lo es. Cuando las personas enfatizan el uso único de la clave, también se olvidan de la consistencia de la distribución de claves, que a menudo es muy importante.

Cuando genero información, violo la regla de una sola vez, entonces las consecuencias son inevitables.

Dos, implementación del algoritmo de 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)
  • La función chr(i) devuelve el carácter ASCII correspondiente al entero i, que es el opuesto de ord(), y el parámetro toma un número positivo entre [0,255]. Esta función está disponible en todas las versiones de python2 y python3. sin problemas de compatibilidad
  • key = keys.pop() if len(keys) == 1 else None es una forma avanzada y eficiente de escribir en Python, y también se puede escribir como:

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

Similar a x**2 para x en el rango (10), este método de escritura también se puede escribir como:


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

La función enumerate() se usa para combinar un objeto de datos transitable (como una lista, una tupla o una cadena) en una secuencia de índice, y listar subíndices de elementos y elementos al mismo tiempo, que generalmente se usa en bucles for.

Supongo que te gusta

Origin blog.csdn.net/qq_44000141/article/details/130373266
Recomendado
Clasificación