Perl AES与Ruby AES

Perl AES与Ruby AES,ruby,perl,encryption,aes,Ruby,Perl,Encryption,Aes,我无法让Perl和Ruby就CBC AES达成一致: Perl use Crypt::CBC; use MIME::Base64::Perl; my $cipher = Crypt::CBC->new( -key => 'd2cb415e067c7b13', -iv => 'e36dc751d0433f05', #random 16chars!!!!!! shold NOT repeat between req

我无法让Perl和Ruby就CBC AES达成一致:

Perl

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}'"
需要“openssl”
需要“摘要/sha2”
需要“base64”
message=“非常长的文本有不同的结果???”
cipher=OpenSSL::cipher.new('aes-128-cbc'))
#消化密钥、iv和hmac_密钥,因此我们有16字节的长度
#而且,它看起来更像一个时髦的密码
#准备密码
加密
cipher.key=aes_key=“d2cb415e067c7b13”
cipher.iv=aes_iv=“e36dc751d0433f05”
加密=密码。更新(消息)

encrypted函数
encode_base64
采用第二个参数,称为“eol”(行尾),默认情况下,该参数为“\n”

返回的编码字符串被分成不超过76行的行 字符,除非为空,否则将以$eol结尾

尝试:


相反。

换行符在Base64中并不重要。两种语言的结果完全相同

虽然绝对没有理由这样做,但您可以让Perl版本返回与Ruby版本相同的字符串,如下所示:

$base64 = encode_base64($encypted, '');
$base64 =~ s/\G.{60}\K/\n/sg;

你确实是对的。但是如果我使用以下字符串
message@somelongstring;123456789013123123
结果可能不同,因为您忘记了在字符串中转义
@
。这样,Perl将在字符串中看到名为
@somelongstring
的数组,并相应地进行插值。你真的应该
严格使用
使用警告;他们会发现这个问题。@Miguel Ping,请不要在评论中提出新的、完全无关的问题。我不知道
@
符号是用perl插入的。评论是相关的;我不想为了保留你(好的)原始答案而重写这个问题。谢谢一个问题是关于base64的。另一个是正确构建字符串。如果你认为它们是同一个问题,你甚至没有做最基本的调试:(
$base64 = encode_base64($encypted, '');
$base64 =~ s/\G.{60}\K/\n/sg;