无法使用libsodium解密加密的文件 [英] Can't decrypt encrypted file using libsodium
问题描述
我正在使用libsodium进行加密,我的问题是解密部分,它没有通过并显示错误.
I'm working on the encryption using libsodium my problem is the decryption part, its not going through and displaying error.
致命错误:未捕获的SodiumException:操作限制必须大于 C:\ xampp \ htdocs \ encrypter \ decrypt.php:18中的堆栈跟踪:#0 C:\ xampp \ htdocs \ encrypter \ decrypt.php(18):sodium_crypto_pwhash()#1 {main}在第18行的C:\ xampp \ htdocs \ encrypter \ decrypt.php中抛出
Fatal error: Uncaught SodiumException: ops limit must be greater than 0 in C:\xampp\htdocs\encrypter\decrypt.php:18 Stack trace: #0 C:\xampp\htdocs\encrypter\decrypt.php(18): sodium_crypto_pwhash() #1 {main} thrown in C:\xampp\htdocs\encrypter\decrypt.php on line 18
我试图在加密代码中复制一些行,但是没有用.
I tried to copy some lines in the encryption code but didn't work.
我也收到警告.
但是我不知道这是否是原因.我也收到加密的邮件.
But I don't know if this is the cause. I also receive this on encryption.
警告:unpack():64位格式代码不适用于32位 第11行的C:\ xampp \ htdocs \ encrypter \ decrypt.php中的PHP版本
Warning: unpack(): 64-bit format codes are not available for 32-bit versions of PHP in C:\xampp\htdocs\encrypter\decrypt.php on line 11
警告:unpack():64位格式代码不适用于32位 第12行的C:\ xampp \ htdocs \ encrypter \ decrypt.php中的PHP版本
Warning: unpack(): 64-bit format codes are not available for 32-bit versions of PHP in C:\xampp\htdocs\encrypter\decrypt.php on line 12
更新
-
通过将pack()代码从
P
更改为V
来解决警告.
更改代码后,$opslimit
的值大于0.
Upon changing the code the $opslimit
has a value more than 0.
解密代码
$password = 'password';
$encrypted_file = 'tmp/inc.php';
$decrypted_file = 'tmp/inc.dec';
$fd_in = fopen($encrypted_file, 'rb');
$fd_out = fopen($decrypted_file, 'wb');
$alg = unpack('C', fread($fd_in, 1))[1];
$opslimit = unpack('V', fread($fd_in, 8))[1];
$memlimit = unpack('V', fread($fd_in, 8))[1];
$salt = fread($fd_in, SODIUM_CRYPTO_PWHASH_SALTBYTES);
$header = fread($fd_in, SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES);
$secret_key = sodium_crypto_pwhash(SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES,
$password, $salt, $opslimit, $memlimit, $alg);
$stream = sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $secret_key);
do {
$chunk = fread($fd_in, $chunk_size + SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES);
$res = sodium_crypto_secretstream_xchacha20poly1305_pull($stream, $chunk);
if ($res === FALSE) {
break;
}
list($decrypted_chunk, $tag) = $res;
fwrite($fd_out, $decrypted_chunk);
} while (!feof($fd_in) && $tag !== SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL);
$ok = feof($fd_in);
fclose($fd_out);
fclose($fd_in);
if (!$ok) {
die('Invalid/corrupted input');
}