python3 implementa cifrado, descifrado y manejo de errores AES

Tabla de contenido

Dato 1: la medición real es factible, ligeramente diferente

¿Por qué la longitud del texto cifrado se debe completar con 16 dígitos y un error causado por dígitos insuficientes? 

Datos 2: expandir la referencia


 

Dato 1: la medición real es factible, ligeramente diferente

 

Prefacio

Escribí un artículo sobre cifrado aes antes, y el método de escritura no estaba maduro en ese momento. Después de referirme al blog de otro blogger, de repente me di cuenta. Adjunte la dirección aquí:
http://blog.csdn.net/hh775313602/article/details/78991340

codificación

#AES-demo

import base64
from Crypto.Cipher import AES

'''
采用AES对称加密算法
'''
# str不是16的倍数那就补足为16的倍数
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
#加密方法
def encrypt_oracle():
    # 秘钥
    key = '123456'
    # 待加密文本
    text = 'abc123def456'
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #先进行aes加密
    encrypt_aes = aes.encrypt(add_to_16(text))
    #用base64转成字符串形式
    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 执行加密并转码返回bytes
    print(encrypted_text)
#解密方法
def decrypt_oralce():
    # 秘钥
    key = '123456'
    # 密文
    text = 'qR/TQk4INsWeXdMSbCDDdA=='
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #优先逆向解密base64成bytes
    base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
    #执行解密密并转码返回str
    decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') 
    print(decrypted_text)

if __name__ == '__main__':
   # encrypt_oracle()
    decrypt_oralce()

para resumir

La idea general no ha cambiado,

Utilice el aes del módulo pyCryptodome para establecer primero la clave secreta,

Y el texto que se va a cifrar se rellena con 16 bits,

Luego, codifica en base64-bit el código de bytes generado por aes,

Se puede convertir en forma de cadena;

 

La idea de descifrado se puede revertir:

Primero descifre en sentido inverso base64 en bytes, realice el cifrado de descifrado y transcodifique para devolver str, reemplace el '\ 0' de los dígitos adicionales con vacío

 


[Error 1]: ¿Por qué el texto encriptado debe llenarse con 16 dígitos y el número de dígitos es insuficiente para causar un error? 

 

[Mensaje de error]: Los datos deben estar alineados para bloquear el límite en el modo ECB                   python Cuando se utiliza Crypto para el cifrado y descifrado del modo ECB aes, se encuentra un error de descifrado.

[Causa]: los datos cifrados no se complementan y la longitud de los datos debe ser un múltiplo entero de 16.

[Solución]: Complete los datos originales:

# str不是16的倍数那就补足为16的倍数
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
python aes加解密 ecb模式 加密 
报错ValueError: Data must be aligned to block boundary in ECB mode


from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
BLOCK_SIZE = 32 # Bytes
 
key = 'abcdefghijklmnop'
cipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg = cipher.encrypt(pad(b'hello', BLOCK_SIZE))
print(msg.hex())
decipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg_dec = decipher.decrypt(msg)
print(unpad(msg_dec, BLOCK_SIZE))

需要用block_size 补充位数
此处是模拟php openssl_encrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA)

[Error 2]: [información de error]: TypeError: el tipo de objeto <class'str '> no se puede pasar al código C           

     

[Razón]: los datos que se colocan en el cifrador deben ser una matriz de bytes

[Solución]: transcodificación base64


Datos 2: expandir la referencia

 

Con los rastreadores desenfrenados y desenfrenados en Internet, para limitar la recopilación de sus propios datos en la mayor medida posible, los principales sitios web han agregado varios métodos anti-rastreo, como:

Generar reconocimiento de huellas dactilares UA del navegador;
utilizar varios métodos de verificación (mensajes de texto, controles deslizantes, hacer clic en caracteres chinos, hacer clic) para identificar;
...
este tipo de medio anti-escalada es una capa de defensa, similar a las puertas de un castillo. Mientras rompa esta línea de defensa, puede hacer lo que quiera.

Además, hay algunos sitios web que realizarán una segunda capa de defensa y agregarán diversas medidas restrictivas a los datos, como la ofuscación y el cifrado. Es como después de entrar por la puerta de la ciudad, si queremos entrar al centro de la ciudad de XX, tenemos que pasar por las insignias y verificaciones de los oficiales y soldados en la puerta.

Por ejemplo, un sitio web de comercio electrónico utiliza cifrado AES en los datos, y los datos devueltos se muestran en la siguiente figura:

Después del descifrado, podemos obtener los datos reales como se muestra en la siguiente figura:

Esto se logra usando Python para el descifrado AES. A continuación, introduzcamos el cifrado AES y el descifrado AES de datos en Python.

Directorio de artículos

1. Introducción al algoritmo AES El
siguiente contenido proviene de Internet, puedes echarle un vistazo, si quieres aprender más, puedes encontrar materiales especiales para aprender:

El nombre completo de AES es Advanced Encryption Standard, que es un acrónimo de Advanced Encryption Standard.

El estándar de cifrado AES, también conocido como método de cifrado de estándar de cifrado avanzado Rijndael, es el estándar de cifrado del siglo XXI que el Instituto Nacional de Estándares y Tecnología (NIST) pretende reemplazar a DES. El requisito básico de AES es adoptar un sistema de cifrado de bloques simétrico. La longitud de la clave puede ser de 128, 192 o 256 bits, y la longitud del bloque es de 128 bits. El algoritmo debe ser fácil de implementar en varios hardware y software. En 1998, NIST inició la primera ronda de análisis, pruebas y solicitudes de AES, y se produjeron un total de 15 algoritmos candidatos. [1]

La segunda ronda de análisis y pruebas de AES2 se completó en marzo de 1999. El 2 de octubre de 2000, el gobierno de los Estados Unidos anunció oficialmente la selección de Rijndael, un algoritmo criptográfico propuesto por los criptógrafos belgas Joan Daemen y Vincent Rijmen, como el algoritmo de cifrado AES.

El bloque de datos cifrados AES y la longitud de la clave pueden ser de 128b, 192b y 256b. El cifrado AES tiene muchas rondas de repetición y transformación. Los pasos generales son los siguientes: ①Expansión de teclas; ②Ronda inicial; ③Rondas de repetición (Rondas), cada ronda repetida incluye subbytes (SubBytes), cambio de fila (ShiftRows), mezcla de columnas (MixColurmns), operación de adición de tecla de ronda (AddRoundKey) y otras operaciones; ① Ronda final (Ronda final), no hay operación de mezcla de columnas (MixColumns) en la ronda final.

2. Cifrado AES
Aquí, elegimos el modo CBC en el algoritmo de cifrado AES para demostrarlo.

Como mencionamos anteriormente, el modo CBC del algoritmo de cifrado AES utiliza claves y compensaciones para cifrar datos, por lo que primero definimos varios parámetros públicos, incluidos los datos originales, claves, compensaciones y el modo AES CBC, el código es el siguiente:

a = '' '(' name ':' Mr. State ',' url ':' zmister.com ',' desc ':' Programming application combat ')' '' # Datos brutos
k = 'zmistercomzmiste'.encode ( 'utf-8') # Key
iv = b'1234567890asdfgh '# Offset
mode = AES.MODE_CBC # Mode
plus Python learning qq skirt: 10667510 Juego completo gratuito de tutoriales de materiales de aprendizaje básicos, el campamento base de intercambio de aprendizaje de programadores
está aquí, nosotros El conjunto La longitud de la clave es una cadena de 16 bits, que tiene bytes de 128 bits. En el algoritmo de cifrado AES, la longitud de la clave debe ser una cadena de 16 bits (128 bytes), una cadena de 34 bits (192 bytes), 32 bits cadena (256 bytes).

A continuación, creamos una función para cifrar los datos originales:

# Datos encriptados
def cryp_str (value):
    value = value.encode ('utf-8') # Codifica datos en utf-8
    cryptor = AES.new (k, mode, iv) # Crea una nueva instancia de AES
    length = 16
    count = len (valor)
    # Si la longitud de los datos es menor que la longitud de la clave
    if count <length:
        add = (length-count)
        # \ 0 backspace
        text = value + ('\ 0' * add) .encode ('utf- 8 ')
    elif count> length:
        add = (
        length- ( count% length)) text = value + (' \ 0 '* add) .encode (' utf-8 ')
    ciphertext = cryptor.encrypt (text) # encriptado carácter String
    print ("Datos cifrados originales:", texto cifrado)
    ciphertext_hex = b2a_hex (texto cifrado) # Cadena para
    imprimir datos hexadecimales ("Cifrado hexadecimal:",texto cifrado_hex)
    ciphertext_hex_de = ciphertext_hex.decode ()
    print ("Cadena cifrada hexadecimal:", ciphertext_hex_de)
    return ciphertext_hex_de
Pasamos los datos originales y lo ejecutamos, y podemos obtener los datos cifrados, como se muestra en la siguiente figura:

Después de completar el cifrado AES de los datos usando Python, continuamos usando Python para descifrar los datos cifrados AES.

3. Descifrado AES
En comparación con el cifrado AES, el descifrado AES es mucho más sencillo. Primero creamos una instancia de una clase AES, luego convertimos los datos hexadecimales cifrados en una forma de cadena, luego llamamos al método decrypt () de la instancia AES para descifrar los datos y finalmente decodificar los datos descifrados, puede obtener los datos originales, el código es como sigue:

# Descifrar datos
def decry_str (valor):
    cryptor = AES.new (k, mode, iv) # Crear una instancia AES
    value_hex = a2b_hex (valor) # Convertir datos hexadecimales en una cadena
    plain_text = cryptor.decrypt (value_hex) # Descifrar el string
    print ("datos descifrados:", plain_text)
    print ('Decodificar y descifrar datos:', bytes.decode (plain_text) .rstrip ('\ 0'))
    return bytes.decode (plain_text) .rstrip ('\ 0' )
Le pasamos los datos previamente cifrados AES como parámetro y lo ejecutamos, y finalmente obtenemos los datos originales descifrados, como se muestra en la siguiente figura:

De esta forma, hemos completado el cifrado AES y el descifrado de los datos utilizando Python.

4. Finalmente,
en los sitios web reales, es posible que los datos no solo estén encriptados por un método de encriptación, sino que más datos encriptados sean ofuscados y encriptados usando múltiples métodos de encriptación. Ante esta situación, primero debes averiguar el proceso de cifrado de datos y no intentarlo a ciegas.
 

Supongo que te gusta

Origin blog.csdn.net/zzddada/article/details/115208255
Recomendado
Clasificación