2016-10-14 19 views
0

AES-256 CBCはPHPまたはRubyで文字列を暗号化できます(宝石symmetric-encryptionを使用)。AES-256 Ruby/PHPでCBC暗号化に成功しましたが、CryptoJSで復号化に失敗します

<?php 
openssl_encrypt(
    'Hello!', 'aes-256-cbc', '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF', 0, '1234567890ABCDEF1234567890ABCDEF' 
); // => 'BAd5fmmMTvRE4Ohvf3GpCw==' 
ruby_cipher = SymmetricEncryption::Cipher.new(key: "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF", iv: "1234567890ABCDEF1234567890ABCDEF", cipher_name: 'aes-256-cbc') 
ruby_cipher.encrypt("Hello!") # => "BAd5fmmMTvRE4Ohvf3GpCw==" 

しかし、私はCryptoJSを使用して、JavaScriptで同じ文字列を復号化するために失敗します。限り、私はドキュメントを解釈することができます:

var encrypted = CryptoJS.AES.encrypt( "Message"、key、{iv:iv});

var decrypted = CryptoJS.AES.decrypt( "Message"、key、{iv:iv});

my jsfiddleか、ここでの私の失敗した試行チェックアウト:

var key   = CryptoJS.enc.Hex.parse("1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF"); 
var iv    = CryptoJS.enc.Hex.parse"1234567890ABCDEF1234567890ABCDEF"); 

var ruby_encrypted = "BAd5fmmMTvRE4Ohvf3GpCw==";       // Output from the Ruby encryption 
var js_encrypted = CryptoJS.AES.encrypt("Hello!", key, { iv: iv });  // Test to confirm that CryptoJS can decrypt its own encrypted 

var ruby_decrypted = CryptoJS.AES.decrypt(ruby_encrypted, key, { iv: iv }); // Object { words: Array[4], sigBytes: -129 } 
var js_decrypted = CryptoJS.AES.decrypt(js_encrypted, key, { iv: iv }); // Object { words: Array[4], sigBytes: 6 } 

console.log(ruby_decrypted.toString(CryptoJS.enc.Utf8));     // 
console.log(js_decrypted.toString(CryptoJS.enc.Utf8));      // Hello! 

復号化が失敗した理由を任意のアイデアを?

+0

Btw、私はOpenSSLがどのように動作するのか少し答えを明確にしました。 –

答えて

0

PHPとRubyがキーを受け取り、IVをバイナリ文字列として受け取ります。彼らはそれが16進コードであるとは想定していません。つまり、64文字のキーの最初の32文字だけが使用されます。 OpenSSLは、必要なバイト数だけを静かに使用し、エラーを投げません(この場合はこれが必要です)。

はおそらくCryptoJSにこのような何かをしたい:このキーは、その中の256ビットを有しているが

var key = CryptoJS.enc.Utf8.parse("1234567890ABCDEF1234567890ABCDEF"); 
var iv  = CryptoJS.enc.Utf8.parse("1234567890ABCDEF"); 

ので、セキュリティが実際には128ビットであり、各文字はヘキサで唯一の4ビットを持っているので、エンコードされた文字列。

関連する問題