2015-11-07 53 views
1

我想學習的JavaScript和我正在學習一個教程,我想我輸入正確的一切,但由於某種原因我使用cypto-js庫加密的字符串不能未加密正確。我沒有收到錯誤,但未加密的字符串不正確。我使用的是Macintosh和「crypto-js」:「^ 3.1.5」。JavaScript的加密庫不能加密和解密一個簡單的例子程序中的字符串

這是我的示例代碼。

var crypto = require('crypto-js'); 

var secretMessage = 'I hid the chips under the couch.'; 
var secretKey = '123abc'; 

var encryptedMessage = crypto.AES.encrypt(secretMessage, secretKey); 
console.log('encryptedMessage: ' + encryptedMessage); 

var bytes = crypto.AES.decrypt(encryptedMessage, secretKey); 
var decryptedMessage = bytes.toString(crypto.enc.utf8); 
console.log('decrpt2: ' + decryptedMessage); 

這裏是我得到

$ node example-encryption.js 
    encryptedMessage: U2FsdGVkX180KTEpMiLEjZDSAkhNkmbBuRa9RXFwCgx6gA/PUFr+KOIv6Gr6TgIYrkfUu3F+OM/kRJ3sTTgsfg== 
    decrpt2: 49206869642074686520636869707320756e6465722074686520636f7563682e 

能有人幫的結果?

感謝, 格雷格

+0

呃,它是'crypto.enc.Utf8'而不是'crypto.enc.utf8'。你傳遞的是未定義的,這會導致默認編碼,即Hex。 –

+1

我很好奇,爲什麼不使用內置的'crypto'模塊? – mscdex

+0

一個字母變化產生了差異。謝謝。 –

回答

1

有你的代碼的幾個問題,其中主要是,你需要提供正確長度的密鑰,你還需要一個cipherParams對象傳遞給解密()方法而不是密文本身。

下面是一些代碼,工程和,加分,一般與OpenSSL的二進制文件和PHP庫在大多數系統中compatibable:

var CryptoJS = require('crypto-js'); 

var secretMessage = 'I hid the chips under the couch.'; 
var secretKey = 'b52b4f45b6e9337b57869d7cb718c693'; 

var encryptedMessage = CryptoJS.AES.encrypt(secretMessage, CryptoJS.enc.Hex.parse(secretKey), 
         { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }); 

console.log('encryptedMessage: ' + encryptedMessage.ciphertext); 

cipherParams = CryptoJS.lib.CipherParams.create(
       {ciphertext: CryptoJS.enc.Hex.parse(encryptedMessage.ciphertext.toString())}); 

var bytes = CryptoJS.AES.decrypt(cipherParams,CryptoJS.enc.Hex.parse(secretKey), 
      { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }); 

console.log('Decrypted:' + bytes.toString(CryptoJS.enc.Utf8)); 

沒有Initiatlization矢量,因爲我們使用的是歐洲央行,而不是CBC。如果你想要一些安全的東西,那麼每個消息都要隨機使用CBC。