Perl AES与Ruby AES
我无法让Perl和Ruby就CBC AES达成一致: PerlPerl 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
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;