CryptoJS AES解密用PHP openssl_encrypt加密的消息

布拉克

我有以下使用openssl_encrypt()功能加密消息的PHP代码这是代码:

$ciphering = "AES-128-CTR";
$options = 0;
$encryption_iv = '5192001995060634';
$encryption_key = "TasKagitMakas";
  
function encrypt ($string) {
  global $ciphering, $options, $encryption_iv, $encryption_key;
 
  $encryption = openssl_encrypt($string, $ciphering, 
                $encryption_key, $options, $encryption_iv); 
  $encryption = strtr(base64_encode($encryption), '+/=', '-_,');
  return $encryption;
}

我试图逆转上述过程,并使用CryptoJS获得Javascript实现。这是我想出的:

var str = "bzB5UVNBclRHbWhlQUs4aHJoMHVxR1BJNEF1Sk9BRkpvbEpBRDFnVmg0MEx4RGtqWllvdUIrSW0vZGY3eG1KMVd2b2JxRFlOTnJ6N2FnPT0,";

str = str.split("-").join("+");
str = str.split("_").join("/");
str = str.split(",").join("=");

var encrypted = CryptoJS.enc.Base64.parse(str);
var encryptedStr = encrypted.toString(CryptoJS.enc.Utf8);
var key = "TasKagitMakas";
var iv  = "5192001995060634";

var decrypted = CryptoJS.AES.decrypt(encryptedStr, key, {iv: iv, mode: CryptoJS.mode.CTR});

console.log(decrypted.toString(CryptoJS.enc.Utf8));

这段代码给了我空白的输出,什么也没有。我在这里做错了什么?我该如何纠正我的实施?

托帕可

PHP代码:

  • openssl_encrypt用零值填充密钥,直到达到指定的密钥长度,即密钥TasKagitMakas扩展为TasKagitMakas\0\0\0
  • $options = 0表示密文是隐式Base64编码的。由于密文此后再次经过显式的Base64编码,因此它总共被Base64编码两次这是不必要的,应使用进行更改$options = OPENSSL_RAW_DATA
  • 对于像CTR这样的流密码模式,会openssl_encrypt自动禁用默认的PKCS7填充。

JavaScript代码:

  • 由于在PHP代码中对Base64进行了两次编码,因此有必要在JavaScript代码中对Base64进行两次解码。当然,只有未更改的PHP代码才需要执行此步骤。
  • 必须WordArray使用Utf8编码器将Key和IV解析为必须使用扩展密钥。
  • CryptoJS.AES.decrypt期望密文作为CipherParams对象。
  • 与PHP不同,CryptoJS不会自动禁用流密码模式的默认PKCS7填充,即必须将其显式禁用。

以下JavaScript代码解密密文:

var str = "bzB5UVNBclRHbWhlQUs4aHJoMHVxR1BJNEF1Sk9BRkpvbEpBRDFnVmg0MEx4RGtqWllvdUIrSW0vZGY3eG1KMVd2b2JxRFlOTnJ6N2FnPT0,";

str = str.split("-").join("+");
str = str.split("_").join("/");
str = str.split(",").join("=");

var encrypted = CryptoJS.enc.Base64.parse(str);           // Base64 decode twice (as long as this happens in the PHP code)
var encrypted = encrypted.toString(CryptoJS.enc.Utf8);
var encrypted = CryptoJS.enc.Base64.parse(encrypted);

var key = CryptoJS.enc.Utf8.parse("TasKagitMakas\0\0\0"); // Expand the key and use the Utf8 encoder
var iv  = CryptoJS.enc.Utf8.parse("5192001995060634");    // Use the Utf8 encoder

var decrypted = CryptoJS.AES.decrypt(
  {
    ciphertext: encrypted                                 // Pass teh ciphertext as CipherParams object
  }, 
  key, 
  {
    iv: iv, 
    mode: CryptoJS.mode.CTR, 
    padding: CryptoJS.pad.NoPadding                       // Disable the PKCS7 padding
  });

console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

输出:

399002  Örnek2  Öğrenci [email protected]   Team1   6 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章