Pregunta

Por una serie de razones complicadas. Necesitamos enviar imágenes a través de la red en estado cifrado y descifrarlas en el otro lado usando AES. En el lado del servidor aquí es lo que sucede:

openssl aes-256-cbc -in pup.jpg -out pup.jpg.enc
base64 pup.jpg.enc > pup.jpg.enc.b64

En el lado del cliente aquí está el JavaScript que estamos usando:

<img id="picture"/>
<script>
    var picture = document.getElementById("picture");
    var data = new XMLHttpRequest();
    data.open('GET', 'http://server.com/pup.jpg.enc.b64', true);
    data.onreadystatechange = function(){
        if(this.readyState == 4 && this.status==200){
            var dec = CryptoJS.AES.decrypt(data.responseText, "password");
            var plain = CryptoJS.enc.Base64.stringify( dec );
        picture.src = "data:image/jpeg;base64,"+plain;
        }
    };
    data.send(null);
</script>

Estoy obteniendo una desviación en la entrada y la salida, y no puedo averiguar por qué, por mi vida. Aquí está la entrada y salida:

In:  /9j/4RLKRXhpZgAATU0AKgAAAAgADAEAAAMAAAABBADJx...
Out: /9j/4RLKRXhpZgAATU0AKgAAAAgADAEAAAMAAAABBAAAA...
                                               ^-- deviation

¿Tengo que especificar a los criptojs que estoy usando cifrado de 256 bits?

¿Fue útil?

Solución

El problema parece ser con un error en criptojs que hace que la biblioteca no funcione si la cadena de entrada contiene nuevas líneas. Codificando el archivo como este:

openssl enc -aes-256-cbc -in pup.jpg -pass pass:"password" | base64 | tr -d '\n' > pup.enc

soluciona el problema. El problema quiere con el JavaScript, pero con la codificación. Bueno, y con JavaScript, porque hay un error en criptojs: https://code.google.com/p/crypto-js/issues/detail?id=38

Otros consejos

De la documentación de CryptoJs, menciona el resultado de AES.Decrypt es el mismo tipo que la salida de una función hash. En la sección de salida de Hasher Hay un ejemplo de convertir este WordArray en una cadena codificada de base 64:

    alert(hash.toString(CryptoJS.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E=
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top