-1

CBC AES について Perl と Ruby に同意してもらうことができません。

パール

use Crypt::CBC;
use MIME::Base64::Perl;

my $cipher = Crypt::CBC->new(
        -key         => 'd2cb415e067c7b13',
        -iv          => 'e36dc751d0433f05', #random 16chars!!!!!! shold NOT repeat between requests
        -cipher      => 'OpenSSL::AES',     #this is same as Rijndael
        -literal_key => 1,        
        -header      => "none",
        -keysize     => 16
  );  

$encypted = $cipher->encrypt("a really really long long text has differrent results???");
$base64 = encode_base64($encypted);

print("Ciphertext(b64): $base64");

$de_base64 = decode_base64($base64);
$decrypted = $cipher->decrypt($de_base64);
$c = $cipher->finish;

暗号文(b64): qz4eSQaFkQUkDOyJSbZf5W03HoldwtgvTLq0yJFRViKJnytf3PVSCGW2CYDjO+tRqV20oxeB2VPa 7NqN1TDSNQ==

2VPaセクションの後に改行があり、最後に別の改行があります

ルビー

require 'openssl'
require 'digest/sha2'
require 'base64'

message = "a really really long long text has differrent results???" 
cipher = OpenSSL::Cipher.new('aes-128-cbc')

# digest the key, iv and hmac_key so we have 16-byte length 
# also, it looks more of a funky password
# prepare cipher
cipher.encrypt
cipher.key = aes_key = "d2cb415e067c7b13"
cipher.iv = aes_iv = "e36dc751d0433f05"


encrypted = cipher.update(message)
encrypted << cipher.final()
b64_encoded = Base64.encode64(encrypted).encode('utf-8') #strict_encode64 guarantees no newlines, encode64 is default

puts "AES Key        : '#{aes_key}'"
puts "AES IV         : '#{aes_iv}'"
puts "Ciphertext(b64): '#{b64_encoded}'"

暗号文(b64): 'qz4eSQaFkQUkDOyJSbZf5W03HoldwtgvTLq0yJFRViKJnytf3PVSCGW2CYDj O+tRqV20oxeB2VPa7NqN1TDSNQ=='

前後のnewlines文字に注意してくださいCYDj==

私は次を見てきました: Perl & Ruby exchange AES encrypted information , but I'm not usingpadding=0

4

2 に答える 2

7

Base64 では、改行は重要ではありません。両方の言語でまったく同じ結果が得られました。

そうする理由はまったくないはずですが、次のように、Perl バージョンが Ruby バージョンと同じ文字列を返すようにすることができます。

$base64 = encode_base64($encypted, '');
$base64 =~ s/\G.{60}\K/\n/sg;
于 2012-10-15T17:27:19.757 に答える
3

このencode_base64関数は、"eol" (行末) と呼ばれる 2 番目のパラメーターを受け取ります。これは、デフォルトでは '\n' です。

返されたエンコードされた文字列は、それぞれ 76 文字以下の行に分割され、空でない限り $eol で終わります

試す:

$base64 = encode_base64($encypted, '');

代わりは。

于 2012-10-15T17:26:45.127 に答える