3

我希望有人能对过去几个小时一直困扰我的问题有所了解。

我正在尝试解码已在 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 || 麒麟一番](我只是在开玩笑)

PS这里有一个关于 SO 的类似问题,遗憾的是,这对我的案例没有任何启发。

4

1 回答 1

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 重新加密,然后在解密实现中使用该 IV。

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

于 2012-07-03T11:37:27.687 回答