2013-12-11 49 views
9

我試圖使用CryptoJS對數據進行編碼/解碼,作爲我想開發的代碼的初步測試。這是我用來加密的代碼:無法使用CryptoJS解密字符串

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script> 
var message = "Secret Message"; 
var key = CryptoJS.enc.Hex.parse('36ebe205bcdfc499a25e6923f4450fa8'); 
var iv = CryptoJS.enc.Hex.parse('be410fea41df7162a679875ec131cf2c'); 

// Encription. Works ok 
var encrypted = CryptoJS.AES.encrypt(
     message,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('encrypted:'+encrypted.ciphertext.toString()); 
<script> 

這是我用來解密的第一個測試。它的工作原理確定,返回3f0e590d2617dc7007b89350bd590409

// Decription. Works ok with "encrypted" parameter 
var decrypted = CryptoJS.AES.decrypt(
     encrypted,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('decrypted:'+decrypted.toString(CryptoJS.enc.Utf8)); 

讓我們通知,encrypted參數是從以前調用CryptoJS.AES.encrypt結果。這是一個對象。

我的問題是,當我試圖直接解密字符串:

// Decription. It fails with manual data 
var manual_data = CryptoJS.enc.Hex.parse('3f0e590d2617dc7007b89350bd590409'); 
var decrypted = CryptoJS.AES.decrypt(
     manual_data,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('decrypted, by hand:'+decrypted.toString(CryptoJS.enc.Utf8)); 

它返回一個「空」的對象(在上面的例子中一個空字符串)。似乎有一些CryptoJS.AES.decrypt需要的數據存儲在第一個示例的加密對象中,但是第二個示例的數組不存在。

有沒有人知道爲什麼會發生這種情況?

回答

18

我一直在搞這個,我想我已經找到了你的問題。主要問題是這條線encrypted.ciphertext.toString()。你想要的只是encrypted.toString()

CryptoJS爲此對象定義toString函數,它返回可以安全發送的加密消息。因此,如果我們改變,我們將有這樣的事情:

var encrypted = CryptoJS.AES.encrypt(
    message, 
    key, 
    { 
    iv: iv, 
    mode: CryptoJS.mode.CBC, 
    padding: CryptoJS.pad.Pkcs7 
    } 
); 
console.log('   encrypted: '+encrypted.toString()); 

這將輸出的Pw5ZDSYX3HAHuJNQvVkECQ==代替3f0e590d2617dc7007b89350bd590409。你的第二個函數工作的原因是因爲它不使用encrypted.ciphertext.toString()它只是使用實際的對象,所以沒有改變。對於最後一個,我們將改變您使用的錯誤文本到沒有ciphertext部分而返回的新文本,但我們也必須刪除CryptoJS.enc.Hex.parse。我真的不知道你在這裏做什麼,但我可以調查你的意思。

var manual_data = 'Pw5ZDSYX3HAHuJNQvVkECQ=='; 
var decrypted = CryptoJS.AES.decrypt(
    manual_data, 
    key, 
    { 
    iv: iv, 
    mode: CryptoJS.mode.CBC, 
    padding: CryptoJS.pad.Pkcs7 
    } 
); 
console.log(' decrypted, by hand: '+decrypted.toString(CryptoJS.enc.Utf8)); 

這應該記錄正確的東西。

我甚至爲此創建了JSBin。這是我第一次使用JSBin,所以我希望我做對了。

+2

非常感謝,DutGRIFF,這是一個棘手的問題:) –

+0

JSBin很快......它完成了這項工作。 –

相關問題