perl [email protected][email protected]

wd2eg0qa  于 2023-11-22  发布在  Perl
关注(0)|答案(1)|浏览(239)

以下JavaScript代码:

  1. 'use strict';
  2. const CryptoJS = require('crypto-js');
  3. const plaintext = 's3cret';
  4. const password = 'MyPassword';
  5. //const iv = CryptoJS.lib.WordArray.random(16);
  6. //const salt = CryptoJS.lib.WordArray.random(16);
  7. const iv = CryptoJS.enc.Hex.parse("43c9ccba630fe1cd61fc2bdb90121c6f"); // For testing
  8. const salt = CryptoJS.enc.Hex.parse("5c788a415851e909d9c7951717714204"); // For testing
  9. const key = CryptoJS.PBKDF2(password, salt, {keySize: 128/32, iterations: 1000});
  10. const b64ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext.toString(CryptoJS.enc.Base64);
  11. console.log(b64ciphertext);

字符串
1.使用[email protected],生成:

  1. 'use strict';
  2. const plaintext = 's3cret';
  3. const password = 'MyPassword';
  4. //const iv = CryptoJS.lib.WordArray.random(16);
  5. //const salt = CryptoJS.lib.WordArray.random(16);
  6. const iv = CryptoJS.enc.Hex.parse("43c9ccba630fe1cd61fc2bdb90121c6f"); // For testing
  7. const salt = CryptoJS.enc.Hex.parse("5c788a415851e909d9c7951717714204"); // For testing
  8. const key = CryptoJS.PBKDF2(password, salt, {keySize: 128/32, iterations: 1000});
  9. console.log("key: " + key.toString(CryptoJS.enc.Base64));
  10. const b64ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext.toString(CryptoJS.enc.Base64);
  11. console.log("ciphertext: " + b64ciphertext);
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js" integrity="sha512-a+SUDuwNzXDvz4XrIcXHuCf089/iJAoN4lmrXJg18XnduKK6YlDHNRalv4yd1N40OKI80tFidF+rqTFKGPoWFQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

的数据

  1. key: 8E2dqz889iLAam1MV4wweQ==
  2. ciphertext: eiJkaAmCVjHFKbvY/CnkvQ==


1.使用[email protected],生成:

  1. 'use strict';
  2. const plaintext = 's3cret';
  3. const password = 'MyPassword';
  4. //const iv = CryptoJS.lib.WordArray.random(16);
  5. //const salt = CryptoJS.lib.WordArray.random(16);
  6. const iv = CryptoJS.enc.Hex.parse("43c9ccba630fe1cd61fc2bdb90121c6f"); // For testing
  7. const salt = CryptoJS.enc.Hex.parse("5c788a415851e909d9c7951717714204"); // For testing
  8. const key = CryptoJS.PBKDF2(password, salt, {keySize: 128/32, iterations: 1000});
  9. console.log("key: " + key.toString(CryptoJS.enc.Base64));
  10. const b64ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}).ciphertext.toString(CryptoJS.enc.Base64);
  11. console.log("ciphertext: " + b64ciphertext);
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js" integrity="sha512-E8QSvWZ0eCLGk4km3hxSsNmGWbLtSCSUcewDQPQWZF6pEU8GlT8a5fF32wOl1i8ftdMhssTrF/OhyGWwonTcXA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  1. key: 8NJim/oe3/Q0+wLRq86FGg==
  2. ciphertext: qT1Vtod7ihS2wvtwmlnPow==


[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)输出的Perl等价物由this answer提供:

  1. use strict;
  2. use warnings;
  3. use feature qw( say );
  4. use Crypt::CBC qw( );
  5. use Crypt::PBKDF2 qw( );
  6. use Mojo::Util qw(b64_encode);
  7. my $plaintext = 's3cret';
  8. my $password = 'MyPassword';
  9. #my $iv = Crypt::CBC->random_bytes( 16 );
  10. #my $salt = Crypt::CBC->random_bytes( 16 );
  11. my $iv = pack( "H*", "43c9ccba630fe1cd61fc2bdb90121c6f" ); # For testing
  12. my $salt = pack( "H*", "5c788a415851e909d9c7951717714204" ); # For testing
  13. my $pbkdf2 = Crypt::PBKDF2->new(output_len=>128/8, iterations=>1000);
  14. my $key = $pbkdf2->PBKDF2($salt,$password);
  15. say "key: ", b64_encode($key,'');
  16. my $cipher = Crypt::CBC->new(
  17. -cipher => 'Cipher::AES',
  18. -header => 'none',
  19. -pbkdf => 'none',
  20. -keysize => length($key),
  21. -key => $key,
  22. -iv => $iv
  23. );
  24. my $ciphertext = $cipher->encrypt( $plaintext );
  25. my $b64ciphertext = b64_encode($ciphertext,'');
  26. say "ciphertext: ", $b64ciphertext;


使用Perl,如何获得类似于[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)的输出?

kulphzqa

kulphzqa1#

CryptoJS,v4.1.1默认使用SHA1作为PBKDF2摘要,CryptoJS,v4.2.0默认使用SHA256。为了在Perl代码中使用SHA256,必须添加hash_class => 'HMACSHA2',即:

  1. my $pbkdf2 = Crypt::PBKDF2->new(output_len=>128/8, iterations=>1000, hash_class => 'HMACSHA2');

字符串
完整性:在CryptoJS中,也可以使用hasher选项显式设置摘要:以下代码也将在v4.1.1下使用SHA256作为PBKDF2摘要:

  1. const key = CryptoJS.PBKDF2(password, salt, {keySize: 128/32, iterations: 1000, hasher: CryptoJS.algo.SHA256});


请注意,CryptoJS最近已经停止使用,不再维护。

相关问题