2016-10-14 5 views
0

AES-256 CBC가 PHP 또는 Ruby에서 문자열을 암호화 할 수 있습니다 (보석 symmetric-encryption 사용).Ruby/PHP에서 AES-256 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를 사용하여, 자바 스크립트와 같은 문자열을 해독하는 데 실패합니다. 문서를 해석 할 수있는 한 :

var encrypted = CryptoJS.AES.encrypt ("Message", key, iv : iv));

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

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! 

암호 해독이 실패하는 이유 어떤 생각 : 여기 my jsfiddle 또는 나의 시도가 실패한

체크 아웃?

+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 비트를 가지고 있기 때문에 인코딩 된 문자열.