Question

Pour une multitude de raisons compliquées. Nous devons envoyer des images sur le réseau à l'état crypté et les décrypter de l'autre côté à l'aide d'AES. Côté serveur, voici ce qui se passe:

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

Côté client, voici le javascript que nous utilisons:

<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>

Je reçois un écart dans l'entrée et la sortie, et je ne peux pas comprendre pourquoi, pour la vie de moi. Voici l'entrée et la sortie:

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

Dois-je spécifier aux cryptojs que j'utilise 256 bits?

Était-ce utile?

La solution

Le problème semble être avec un bug dans les cryptojs qui fait que la bibliothèque ne fonctionne pas si la chaîne d'entrée contient de nouvelles lignes. Encodant le fichier comme ceci:

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

résout le problème. Le problème veut avec le javascript, mais avec le codage. Eh bien, et avec JavaScript, car il y a un bug dans les cryptojs: https://code.google.com/p/crypto-js/issues/detail?id=38

Autres conseils

D'après la documentation CryptoJS, il mentionne la sortie d'AES.Decrypt est le même type que la sortie d'une fonction de hachage. Dans La section de sortie de hachage Il y a un exemple de conversion de ce WordArray en une chaîne codée de base 64:

    alert(hash.toString(CryptoJS.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E=
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top