2014-02-18 30 views
0

我試圖實現破譯的AES加密的二進制文件與Crypto.JS

我工作的一個基於瀏覽器的問答遊戲與獲取發送到用戶預先錄製的音頻線索。爲了加載服務器以及讓音頻已經傳輸,文件已經在遊戲開始之前提前發送給用戶。由於遊戲將以實時和競爭的方式進行,因此播放器之前沒有機會收聽音頻文件是非常重要的。我現在的想法是基本上向用戶發送AES加密文件,通過websockets實時發送文件的密碼,在瀏覽器中使用crypto.js解密並立即播放。

的問題

出於某種原因,我不能讓使用crypto.js正確解密的二進制文件,這樣我就可以將其送到decodeAudioData音頻上下文。我從解密或廢話中得到空的答覆。

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

產生的文件,然後通過XMLHttpRequest裝載有:

我試圖

音頻(在這種情況下,MP3)的AES根據使用下列調用的文檔加密請求類型文本(我已經嘗試過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() { ... }); 

然而這會導致什麼可玩的,並僅返回單詞表。我知道我錯過了一些步驟,但我現在完全不知道什麼是不工作的,並且如果有人能指出我正確的方向並告訴我我做錯了什麼,那將更令人高興。

編輯:這裏是我想要達到http://jsfiddle.net/HKu3n/1/

+1

你正在用base64傳輸它...你是否在傳遞給CryptoJS.AES.decrypt之前解碼base64? –

+0

我有種嘗試過一切。這是我嘗試過的最新的東西:http://jsfiddle.net/HKu3n/1/ –

+1

我明白了!即將到來的答案.... –

回答

1

openssl生成一個64位編碼文件的jsfiddle,它插入了很多空白的。特別是,它將輸出分成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可用here

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函數返回由decodeAudioData使用的ArrayBuffer ,但我會把它作爲你的練習。

+1

工程就像一個魅力,非常感謝你,你救了我的一天:D –