繁体   English   中英

使用Crypto.JS解密AES加密的二进制文件

[英]Decipher an AES enciphered binary file with Crypto.JS

我想要实现的目标

我正在研究基于浏览器的测验游戏,其中包含预先录制的音频线索,并将其发送给用户。 为了加载服务器以及已经传输音频,文件已经在游戏开始之前提前发送给用户。 由于游戏是实时和竞争性地进行的,因此玩家之前没有机会收听音频文件是很重要的。 我现在的想法是基本上向用户发送AES加密文件,通过websockets实时发送文件的密码,使用crypto.js在浏览器中解密它并立即播放。

问题

出于某种原因,我无法使用crypto.js正确解密二进制文件,因此我可以将其提供给音频上下文的decodeAudioData。 我从解密或乱码中得到空洞的回复。

我尝试了什么

使用以下调用根据文档对音频(在本例中为mp3)进行AES加密:

openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"testpass" -e -base64

然后生成的文件通过XMLHTTPRequest加载请求类型文本(我已经尝试过arraybuffer但也失败了),结果存储在一个变量( this.protectedBuffer )中。

根据Crypto.js文档,这应该解密文件:

var decrypted = CryptoJS.AES.decrypt(this.protectedBuffer, 'testpass');
// next step obviously doesn't work as decrypted is
// is not an arraybuffer.
context.decodeAudioData(decrypted, function() { ... }); 

但是这会导致无法播放,只返回一个单词列表。 我知道我错过了一些步骤,但我现在完全没有线索什么是无效的,如果有人能指出我正确的方向并告诉我我做错了什么,我会非常高兴。

编辑:这是一个jsfiddle与我想要实现的目标http://jsfiddle.net/HKu3n/1/

openssl生成base64编码的文件时,它会插入大量的空格。 特别是,它将输出分解为64字节行:

U2FsdGVkX18AVcl/JumJawmKlaYWjQwo6wDcETza5AX6VK6aVCMtHXic2xtDIw1G
PJfxbKLJKWgvKXLNGO0jgPTI6qFPllts6VAIzvZ3uqV8BBPd0ge4YJe/q7e7ZGmx
QJyvFnyumo3b2pMxxMWngtl8qpxcsaiSrALnBXZizJ70PcTsyfk7aym1twkj0ofY
...

最后,最后一个换行。 crypto-js加密实用程序并不喜欢所有的空格,因此您必须将其删除(我使用拆分/连接)。 例如:

$.get('/audio.aes', function(data){
    var decrypted = CryptoJS.AES.decrypt(data.split(/\s/).join(''), 'testpass');
    // ...
});

CryptoJS.AES.decrypt返回的是一个WordArray对象。 要将其转换为字符串,您必须调用toString并提供编码:

decrypted.toString(CryptoJS.enc.Utf8);
decrypted.toString(CryptoJS.enc.Base64);

我没有任何方便的音频文件,但我能够使用图像(在/image.aes )端到端地完成这项工作:

$.get('/image.aes', function(data){
    var decrypted = CryptoJS.AES.decrypt(data.split(/\s/).join(''), 'testpass');
    $('#imageContainer').append('<img src="data:image/jpeg;base64,'
        + decrypted.toString(CryptoJS.enc.Base64) + '">');
    });
});

我在另一端看到了一个图像! 您可能需要进行一些争论才能将解码后的数据转换为适合您音频输出的格式,但我希望这能让您超越驼峰。

UPDATE

我使用你的音频使用你的示例jsFiddle。 为了获得ArrayBuffer ,我在这里使用了base64DecToArr

var decoded = CryptoJS.AES.decrypt(request.response.split(/\s/).join(''),
    'testpass');

var arr = base64DecToArr(decoded.toString(CryptoJS.enc.Base64));
context.decodeAudioData(arr.buffer, function (buffer) {
    alert('success decoding buffer');
}, function (err) {
    alert('couldn\'t decode buffer');
});

在这里工作jsFiddle: http//jsfiddle.net/BTnpL/

有可能的转换更有效的方式WordArray从返回的对象crypto-js功能的ArrayBuffer通过使用decodeAudioData ,但我会离开,作为一个练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM