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')

2 番目のスクリプトは次のようになります。

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

私の残された唯一の選択肢は、[ジェマーソン || キリン一番](冗談です)

PS there is a similar question on SO here、悲しいことに、私の場合には何のインスピレーションも得られませんでした。

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 スクリプトが文字列を適切に復号化するようになりました。

残念な副作用の 1 つは、既存の暗号化されたデータを復号化してから、復号化の実装で使用される IV で再暗号化する必要があることです。

PITA ですが、実用的なソリューションです。

于 2012-07-03T11:37:27.687 に答える