es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 = 
Tags:  , , , ,

Answer

  1. Avatar for 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á en ValueError: Invalid padding bytes. Se recomienda utilizar padding.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 utilizar padding.PKCS7(256) para el relleno en lugar de padding.PKCS7(128) para evitar problemas de relleno con mensajes más grandes de 128 bytes.

Comments are closed.