openssl_decrypt无法解密[PHP]



我正试图将解密的节点版本转换为PHP,但我遇到了这个错误-错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度

这是正在运行的node.js版本的解密-https://replit.com/@Olanipekunifie/AES解密

这是返回错误的php版本

<?php

$encrypt_method = "aes-256-cbc";
$secret_key = 'test_sk_7JLVA0RNWbOcMVJzzxx0';
$encypted = "714ac730a2eaafb14528f726f21637178d5a09480c1223d66536cd6078b98baab1f9c2efa763797bd00cd04611de62d0";
$encrypted_buffer = unpack('H*', $encypted);
$hex_values = $encrypted_buffer[1];

// echo $hex_values . " nn";
$iv = substr($hex_values, 0, 16);
echo $iv . "nn";
$final_encrypted_str = substr($hex_values, 16);
$final_key = substr(hash('sha256', $secret_key), 0, 32);
echo $final_key . " key nn";

$decryptedData = openssl_decrypt($final_encrypted_str, $encrypt_method, $final_key, 0, $iv);
$err = openssl_error_string();

echo "err nn" . $err . "nn";

echo "decrypted below nn" . $decryptedData;

请问我做错了什么?

PHP代码包含与IV和密文分离、密钥推导和解密本身有关的错误:

  • 实现分离的一种简单方法如下:

    $encryptedBin = hex2bin($encypted);
    $iv = substr($encryptedBin, 0, 16);
    $ciphertext = substr($encryptedBin, 16);
    
  • 在密钥派生过程中,当前代码返回十六进制编码的散列,而不是Base64编码的散列。一个正确的实现是:

    $key = substr(base64_encode(hash('sha256', $secret_key, true)), 0, 32);
    

    请注意,应用专用密钥推导函数(如Argon2或PBKDF2(进行密钥推导更安全。

  • 在解密时,当前实现期望密文是Base64编码的,而不是作为原始数据传递。一个正确的实现是:

    $decryptedData = openssl_decrypt($ciphertext, $encrypt_method, $key, OPENSSL_RAW_DATA, $iv);
    

通过这些更改,将为发布的输入数据返回预期的明文5368989195724934

最新更新