Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以加密数据,但不能解密_Php_Security_Encryption_Aes - Fatal编程技术网

Php 我可以加密数据,但不能解密

Php 我可以加密数据,但不能解密,php,security,encryption,aes,Php,Security,Encryption,Aes,我可以成功地加密传递的数据,但遗憾的是无法解密它。我的解密函数有什么问题?也许是因为我的初始化向量。这是我的密码: function pad($data, $size) { $length = $size - strlen($data) % $size; return $data . str_repeat(chr($length), $length); } function unpad($data) { return substr($data, 0, -ord($dat

我可以成功地加密传递的数据,但遗憾的是无法解密它。我的解密函数有什么问题?也许是因为我的初始化向量。这是我的密码:

function pad($data, $size) {
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

function unpad($data) {
    return substr($data, 0, -ord($data[strlen($data) - 1]));
}

//CORRECT ENCRYPTION METHOD
function encrypt($data) {
    $key = "SiadajerSiadajer";
    $iv_size = 16; 
    $iv = openssl_random_pseudo_bytes($iv_size, $strong);
    $encryptedData = openssl_encrypt(pad($data, 16), 'AES-256-CBC', $key,   OPENSSL_RAW_DATA, $iv);
    $joinedData = hex2bin(bin2hex($iv).bin2hex($encryptedData));
    $encodedJoinedData = base64_encode($joinedData);
    return $encodedJoinedData; 
}

//WRONG DECRYPTION FUNCTION
function decrypt($encodedJoinedData){
    $key = "SiadajerSiadajer";
    $DecodedData = base64_decode($encodedJoinedData);
    $size = strlen($DecodedData);
    $cipheredsize = $size - 16;
    $iv = substr($DecodedData, 0, 16);
    $halfDecryptedData = substr($DecodedData, 16, $size);
    $decryptedData = openssl_decrypt(unpad($halfDecryptedData, 16), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return $decryptedData;
}

$test = encrypt("sssss");
print $test;
$test2 = decrypt($test);
print $test2;
在加密方法中,替换行

$joinedData = hex2bin(bin2hex($iv).bin2hex($encryptedData));

因为前面表达式中的转换是不必要的。此替换不会改变结果

解密部分的可能解决方案可以是:

function decrypt($encodedJoinedData) {
    $joinedData = base64_decode($encodedJoinedData);                        
    $iv = substr($joinedData, 0, 16);
    $encryptedData = substr($joinedData, 16);
    $key = "SiadajerSiadajer";
    $decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);   
    $unpaddedData = unpad($decryptedData);                              
    return $unpaddedData;
}
$decryptedData没有输出,因此基本上不返回任何内容。添加断点可以帮助您更轻松地进行调试
function decrypt($encodedJoinedData) {
    $joinedData = base64_decode($encodedJoinedData);                        
    $iv = substr($joinedData, 0, 16);
    $encryptedData = substr($joinedData, 16);
    $key = "SiadajerSiadajer";
    $decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);   
    $unpaddedData = unpad($decryptedData);                              
    return $unpaddedData;
}