2013-09-24 105 views
1

我無法獲得crypto的工作。無法用node.js解密v0.10.18 @ Windows 7 64Bit

  • 64位Windows 7
  • 的node.js v0.10.18

加密似乎工作:

var fs = require('fs'); 

var img = new Buffer (fs.readFileSync('./image.png'), 'binary'); 

var crypto = require('crypto') 
    , key = 'salt_from_the_user_document' 
    , plaintext = img 
    , cipher = crypto.createCipher('aes-256-cbc', key) 
    , decipher = crypto.createDecipher('aes-256-cbc', key); 

cipher.update(plaintext, 'binary', 'base64'); 
var encryptBinary = cipher.final('base64') 
console.log('encrypted :', encryptBinary); 

...但解密不是。

decipher.update(encryptBinary, 'base64', 'binary'); 
var decryptBinary = decipher.final('binary'); 
console.log('decrypted :', decryptBinary); 

node-efs相同的解密問題。

var efs = require('efs').init('aes-128-cbc', 'password'); 

// encrypt and write file 
efs.writeFileSync('/tmp/example', 'hello world'); 

// decrypt and read file 
efs.readFileSync('/tmp/example'); 

file-encryptor同樣的問題。

此作品(僅字符串):

var crypto = require('crypto') 
, key = 'salt_from_the_user_document' 
, plaintext = 'password' 
, cipher = crypto.createCipher('aes-256-cbc', key) 
, decipher = crypto.createDecipher('aes-256-cbc', key); 

cipher.update(plaintext, 'utf8', 'base64'); 
var encryptedPassword = cipher.final('base64') 

decipher.update(encryptedPassword, 'base64', 'utf8'); 
var decryptedPassword = decipher.final('utf8'); 

console.log('encrypted :', encryptedPassword); 
console.log('decrypted :', decryptedPassword); 

回答

0

update的調用也返回加密的數據,調用final只返回休息。因此,您需要將每個呼叫的輸出連接到update,最後加上final的輸出。這對於加密和解密(順便說一句,散列)都是如此。

因此它需要的東西,如:

var encrypted = cipher.update(plaintext, 'binary', 'base64'); 
encrypted += cipher.final('base64'); 

然後,它會工作。

請注意updatefinal功能已過時,現在的密碼模塊也是基於流的,你可能仍然想要切換到更現代的方法。

+0

感謝Golo的快速回復。加密工作。但不解密。 – oli

+0

var decrypted = cipher.update(明文,'base64','binary');' 解密+ = decipher.final('binary'); – oli

+0

[截圖](https://s3-eu-west-1.amazonaws.com/uploads-eu.hipchat.com/56830/387870/ee6ndrbskk5apca/cryptojs.png) – oli