CryptoJS y clave/longitud IV

Tengo duda acerca de la clave AES y IV de longitud.

Primero de todo, si, por ejemplo, estoy usando las drogas OpenSSL extensión y openssl_encrypt() método, que se puede ver claramente que la clave para AES de 256 bits debe ser 32 bytes, y IV lanza advertencia si es diferente de 16 bytes. Puedo entender eso, y todo está bien.

Sin embargo, en CryptoJS de la biblioteca de la clave y IV de longitud es frustrante. Este es un ejemplo de:

var text = "test",
    key  = "us5N0PxHAWuIgb0/Qc2sh5OdWBbXGady",
    iv   = "zAvR2NI87bBx746n";

key = CryptoJS.enc.Base64.parse(key);
iv  = CryptoJS.enc.Base64.parse(iv);

crypted = CryptoJS.AES.encrypt(text, key, { iv: iv });

donde la clave es 32 bytes, IV es 16. CryptoJS requiere analizar, y después de CryptoJS.enc.Base64.parse() puedo obtener 48 y 24 bytes en consecuencia. Espero que esos valores se obtiene trunca requiere AES de 256 bits de longitud, y una mayor expansión a n bytes será irrelevante, y así resulta del texto cifrado será el mismo.

Pero eso no está sucediendo. Cuando me pase a CryptoJS.AES.encrypt() de mayor tamaño de la clave y incluso IV, es la producción de salida diferente. Así que mi pregunta es, ¿por qué? ¿Cuál es la diferencia entre CryptoJS biblioteca y OpenSSL en este caso?

OriginalEl autor Damaged Organic | 2015-04-08

1 Kommentar

  1. 11

    Mira como me tienes.

    Si usted tiende a pasar personalizado key y IV en el uso de CryptoJS, asegúrese de que (suponiendo que CryptoJS.enc.Base64.parse() da HEX cadena, que se utiliza en CryptoJS.AES.encrypt()).

    Tomando este ejemplo, con Base64 clave y iv (longitud=22), que CryptoJS cifra como AES-256:

    var message = "some_secret_message";
    
    var key = "6Le0DgMTAAAAANokdEEial"; //length=22
    var iv  = "mHGFxENnZLbienLyANoi.e"; //length=22
    
    key = CryptoJS.enc.Base64.parse(key);
    //key is now e8b7b40e031300000000da247441226a, length=32
    iv = CryptoJS.enc.Base64.parse(iv);
    //iv is now 987185c4436764b6e27a72f2fffffffd, length=32
    
    var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
    
    var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv });
    //data contains "some_secret_message"

    Longitud de la key es de 32 bytes para AES-256. (16 bytes si usted desea conseguir AES-128. Si más, CryptoJS cambiará a mayor longitud de la clave). En otro caso en descifrar usted recibirá un mensaje vacío. Ejemplo:

    var message = "some_secret_message";
    
    var key = "6Le0DgMTAAAAANokdEEial1"; //length=23
    var iv  = "mHGFxENnZLbienLyANoi.e"; //length=22
    
    key = CryptoJS.enc.Base64.parse(key); //length = 17 bytes
    //key is now e8b7b40e031300000000da247441226a5d, length=34 (hex encoded)
    iv = CryptoJS.enc.Base64.parse(iv); //length = 16 bytes
    //iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded)
    
    var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
    
    var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv });
    //data contains "" - an empty string

    También, por lo que puedo ver, sólo x % 8 == 0 bytes de dicho caso de uso da resultado válido.

    Longitud de IV debe ser de 22 bytes (cuando codificado en Base64), y mientras que la transformación con CryptoJS.enc.Base64.parse() obtendrá de 16 bytes (32 hexadecimal codificado), que es, como máximo, para AES-256 tamaño de bloque. Todo lo más que conseguirá truncado.

    var message = "some_secret_message";
    
    var key = "6Le0DgMTAAAAANokdEEial"; //length=22
    var iv  = "mHGFxENnZLbienLyANoi.e"; //length=22
    
    key = CryptoJS.enc.Base64.parse(key); //length=16 bytes
    //key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded)
    iv = CryptoJS.enc.Base64.parse(iv); //length=16 bytes
    //iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded)
    
    var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
    
    var key = "6Le0DgMTAAAAANokdEEial"; //length=22
    var iv  = "mHGFxENnZLbienLyANoi.e123"; //length=25
    
    key = CryptoJS.enc.Base64.parse(key); //length = 16 bytes
    //key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded)
    iv = CryptoJS.enc.Base64.parse(iv); //length = 18 bytes
    //iv is now 987185c4436764b6e27a72f2fffffffded76, length=36 (hex encoded)
    
    var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv }); //data contains "some_secret_message", so additional "123" in IV is irrelevant.
    1. Hay algo mal con sus números. AES tiene un tamaño de bloque de 128 bits, que es también el tamaño esperado de la IV. AES no se especifica para IVs mayor o menor de 16 bytes. IV el tamaño no es el mismo que el tamaño de la clave. 2. 22 bytes no es una cadena codificada en base64. Debe ser divisible por 4 (con opcional de la almohadilla de caracteres).
    Yo objeto. AES tiene un tamaño de bloque de 128 si es AES-128. En el caso de AES-256 – tamaño de bloque es, obviamente, de 256 bits, que es de 32 bytes, que es exactamente lo que se obtiene por CryptoJS.enc.Base64.parse() de 22 bytes cadena Base64. De acuerdo a la especificación y el algoritmo, IV es exactamente el tamaño de bloque de longitud, que es de 32 bytes con AES-256.
    Para profundizar en la explicación, por favor, consulte security.stackexchange.com/questions/15740/…
    Si te refieres a algo, asegúrese de que es compatible con su reclamo: sqrt(23) escribe: «AES pasa a ser uno entre muchos […], con una constante el tamaño de bloque de 16 bytes» y «Vector de Inicialización, que muy a menudo coincide con el tamaño de bloque del sistema de cifrado». No apoyar su reclamación. El tamaño de la clave y el tamaño de bloque son cosas diferentes. El 256 AES-256 se refiere al tamaño de la clave.
    Es por AES-128. Y dice,»Vector de Inicialización, que muy a menudo coincide con el tamaño de bloque del sistema de cifrado». Para el cifrado de bloque modos de operación, el IV es generalmente tan grande como el tamaño de bloque del sistema de cifrado. Así, se parece a 32 bytes para mí de 256 bits AES.

    OriginalEl autor Damaged Organic

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea