¿Por qué recibo un error de ValorIncorrecto al intentar desempaquetar los datos?
En resumen, estoy desarrollando un chat encriptado utilizando ECDH + AES (código fuente en GitHub).
Todos los algoritmos de cifrado y descifrado funcionan bien cuando los pruebo por separado. También funcionan cuando hay solo una conexión establecida con el servidor. Sin embargo, cuando hay más de un socket conectado, obtengo este error.
Y aquí está el código de cifrado/descifrado:
Desde cryptography.hazmat.primitives importar hashes, padding
from cryptography.hazmat.primitives.ciphers import Cipher, algoritmos, modos
desde secrets import token_bytes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
desde cryptography.hazmat.primitives import serialization
desde cryptography.hazmat.primitives.asymmetric import ec
FORMATO = ‘utf-8’
TAMAÑO_BLOQUE = 16
clase DH:
def init(yo):
self.ECDH = ec.generate_private_key(ec.SECP384R1(), default_backend())
esto.public_key = self.ECDH.public_key()
def encrypt(self, public_key, plaintext):
IV = 16 bytes
SALT = 16 bytes
Shared key = 48 bytes
Derived key = 32 bytes
AES = 256 bits
AES = 32 bytes
Padder = 128 or 256 bits
Padder = 16 or 32 bytes
Ciphertext = IV + SALT + MSG
si public_key = otro. llave pública del cliente
si plaintext = texto a cifrar
devuelve: criptograma cifrado
IV = token_bytes(16)
SALT = token_bytes(16)
shared_key = self.ECDH.exchange(ec.ECDH(), public_key)
derived_key = HKDF(
algoritmo=hashes.SHA256(),
longitud=32,
sal=SALT,
info=None
).derive(shared_key)
encryptor = Cipher(
algoritmos.AES(derived_key),
modos.CBC(IV)
).encryptor()
Padder =
davy.ai
Descripción general
El desarrollador está trabajando en una aplicación de chat encriptado utilizando los algoritmos de encriptación ECDH + AES. Los algoritmos de encriptación y desencriptación funcionan bien cuando se prueban por separado o cuando solo hay un socket conectado al servidor. Sin embargo, cuando hay más de un socket conectado, el desarrollador recibe un error de
ValueError: Invalid padding bytes
.Problema
El error ocurre cuando el Cliente1 recibe un mensaje de Cliente2. El servidor decodifica el mensaje correctamente y lo encripta con el mismo IV y salt para los clientes. Sin embargo, el Cliente1 no puede generar la misma clave compartida para decodificar el mensaje, lo que resulta en el
ValueError
.Solución
Cada cliente tiene su propia clave ECDH única y las utiliza para generar diferentes claves compartidas. El servidor está utilizando el mismo IV y salt para ambos clientes. Para solucionar este problema, el desarrollador necesita generar un IV y salt único para cada cliente, o pueden utilizar una clave única para cada sesión.
Además, se está utilizando
padding.PKCS7(128)
para rellenar, lo que significa que solo se puede rellenar un máximo de 128 bytes. Si el tamaño del mensaje es mayor de 128 bytes, el relleno no se aplicará correctamente, lo que resultará enValueError: Invalid padding bytes
. Se recomienda utilizarpadding.PKCS7(256)
en su lugar.Conclusión
Para solucionar el error
ValueError: Invalid padding bytes
, el desarrollador necesita generar claves IV y salt únicas para cada sesión o cada cliente. Además, deben utilizarpadding.PKCS7(256)
para el relleno en lugar depadding.PKCS7(128)
para evitar problemas de relleno con mensajes más grandes de 128 bytes.