1

由于一系列复杂的原因。我们需要以加密状态通过网络发送图像,并在另一端使用 AES 对其进行解密。在服务器端发生了什么:

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

在客户端,这里是我们正在使用的 JavaScript:

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

我的输入和输出出现偏差,我一生都无法弄清楚为什么。这是输入和输出:

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

我是否必须向 CryptoJS 指定我正在使用 256 位加密?

4

2 回答 2

1

问题似乎与 CryptoJS 中的一个错误有关,如果输入字符串包含新行,该错误会导致库无法工作。像这样对文件进行编码:

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

解决了这个问题。问题与javascript有关,但与编码有关。好吧,使用javascript,因为cryptojs中有一个错误:https ://code.google.com/p/crypto-js/issues/detail?id=38

于 2013-11-07T07:51:38.050 回答
0

从 CryptoJS 文档中,它提到 AES.decrypt 的输出与散列函数的输出类型相同。在Hasher Output 部分中,有一个将此 WordArray 转换为 base 64 编码字符串的示例:

    alert(hash.toString(CryptoJS.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E=
于 2013-11-07T01:24:42.600 回答