AES-256-CBC,带有从Ruby到NodeJS的摘要

时间:2012-07-02 19:03:47

标签: ruby node.js

我希望有人可以解释一下过去几个小时让我烦恼的问题。

我正在尝试解码用Ruby编码的字符串:

#!/usr/bin/env ruby

require 'base64'
require 'openssl'
require 'openssl/cipher'
require 'openssl/digest'

aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
aes.encrypt
aes.key = Digest::SHA256.digest('IHazSekretKey') 

p Base64.encode64( aes.update('text to be encrypted') << aes.final )

执行上述吐出:“3P86KyOrN2QJ / HFxxo3b7kAsxTgpDMMjROUPclsuXj0 = \ n”

我现在尝试在NodeJS 0.6.17中解密此字符串

#!/usr/bin/env node

var crypto = require('crypto'); 

function decrypto(toDecryptStr) {
  var result,
    encoded   = new Buffer(toDecryptStr, 'base64'),
    decodeKey = crypto.createHash('sha256').update('IHazSekretKey', 'ascii').digest(),
    decipher  = crypto.createDecipher('aes-256-cbc', decodeKey);

  result = decipher.update(encoded);
  result += decipher.final();

  return result;
};

console.log(decrypto('3P86KyOrN2QJ/HFxxo3b7kAsxTgpDMMjROUPclsuXj0='));
console.log(decrypto('3P86KyOrN2QJ/HFxxo3b7kAsxTgpDMMjROUPclsuXj0=\n')

第二个脚本产生:

nazar@xfce:~/tmp/tst$ ./js_decrypt 
Å'{ H£V)ÜB
Å'{ H£V)ÜB

任何帮助都会非常感激,因为我现在唯一剩下的选择是将自己淹没在[Jamerson || Kirin Ichiban](我只是在开玩笑)

PS在SO here上有一个类似的问题,遗憾的是没有为我的案例提供任何灵感。

1 个答案:

答案 0 :(得分:5)

关键缺失的部分是IV,这是跨语言边界进行加密/解密时所必需的,因为显然加密器会生成随机IV(或类似的东西) - 仍然不理解Ruby如何解密字符串没有IV ......但是我知道什么....),如果没有提供。

以下代码段显示如何在Ruby中加密字符串并在NodeJS中解密。

#!/usr/bin/env ruby

require 'openssl'
require 'base64'
require 'openssl/cipher'
require 'openssl/digest'

aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
aes.encrypt
aes.key = Digest::SHA256.digest('IHazSekretKey') 
aes.iv  = '1234567890123456'

p Base64.encode64( aes.update('text to be encrypted') << aes.final )

以上版画:“eiLbdhFSFrDqvUJmjbUgwD8REjBRoRWWwHHImmMLNZA = \ n”

#!/usr/bin/env node

var crypto = require('crypto'); 

function decrypto(toDecryptStr) {
  var result,
    encoded   = new Buffer(toDecryptStr, 'base64'),
    decodeKey = crypto.createHash('sha256').update('IHazSekretKey', 'ascii').digest(),
    decipher  = crypto.createDecipheriv('aes-256-cbc', decodeKey, '1234567890123456');

  result = decipher.update(encoded);
  result += decipher.final();

  return result;
}

console.log(decrypto('eiLbdhFSFrDqvUJmjbUgwD8REjBRoRWWwHHImmMLNZA=\n'))

JS脚本现在可以正确解密字符串。

一个不幸的副作用是现有的加密数据需要解密,然后用IV重新加密,然后在解密实现中使用。

PITA,但仍然是一个有效的解决方案。