两种语言之间的 AES 加密不产生输出 [关闭]

问题描述 投票:0回答:0

尝试通过 AES 加密将数据从 Javascript 发送到 Perl。但是,在 Perl 端解码时我没有得到任何输出。

编辑:

  1. 期望的行为 - 让 Perl 代码解密由列出的 Javascript 加密的消息。
  2. 特定问题或错误 - 由于未知原因,Perl 代码不解密 javascript 消息。
  3. 重现问题所需的最短代码-详细如下:

JavaScript 加密

var keySize = 256;
var ivSize = 128;
var iterations = 100;

function testcrypt(){
  var pass = 'testpass';
  var msg = 'testmsg';
  var salt = CryptoJS.lib.WordArray.random(128/8);
  var key = CryptoJS.PBKDF2(pass, salt, {
      keySize: keySize/32,
      iterations: iterations
    });
  var iv = CryptoJS.lib.WordArray.random(128/8);
  var encrypted = CryptoJS.AES.encrypt(JSON.stringify(msg), key, {
    iv: iv,
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
  });
  
  // salt, iv will be hex 32 in length 
  // append them to the ciphertext for use  in decryption
  var packet = salt.toString()+'-'+ iv.toString()+'-' + encrypted.toString();
  alert(packet);
}

输出是 -> 71b851532027b022c50f1a389254fca4-d8a9d7c4fa30f7d9427a5762e2c5794b-8S/JOXgDYuRloLKBiH5fYg==

PERL 解密

use warnings;
use strict;

use Crypt::CBC;
use Crypt::PBKDF2;
use MIME::Base64;
print "\nGot: ".decrypt('ebdfcbd226b7dbc73e77a29d31fab723-3daf178979cb03087f5258907e73e547-CyG6R0EU9s0c8dBCAZk6Jg==', 'testpass');
print "\nGot: ".decrypt('71b851532027b022c50f1a389254fca4-d8a9d7c4fa30f7d9427a5762e2c5794b-8S/JOXgDYuRloLKBiH5fYg==', 'testpass');

sub decrypt{
        my $encrypted = shift;
        my $key = shift;

        my($salt,$iv,$packet)=split '-',$encrypted,3;
        $packet = decode_base64($packet);
        my %options=(
                key_len => length $key,
                iv_len  => length $iv,
                iterations => 100,
               # hash_class => 'HMACSHA2',
                hash_class => 'HMACSHA1',  # To match CryptoJS
        );
        $options{output_len}  =  $options{key_len} + $options{iv_len};

        my $pbkdf2 = Crypt::PBKDF2->new(%options);

        my $AES = Crypt::CBC->new(
                #-key    => $pbkdf2->PBKDF2($key,$salt),# Was Reversed
                -key    => $pbkdf2->PBKDF2($salt,$key),
                -cipher => 'Cipher::AES',
                -pbkdf  => 'pbkdf2',
                -header => 'none',
        );

       return $AES->decrypt($packet);

}


perl encryption aes pbkdf2
© www.soinside.com 2019 - 2024. All rights reserved.