Не могу расшифровать зашифрованный файл с помощью libsodium
Я работаю над шифрованием с использованием libsodium, моя проблема в части дешифрования, она не проходит и выдает ошибку.
Неустранимая ошибка: Uncaught SodiumException: ограничение ops должно быть больше 0 в C:\xampp\htdocs\encrypter\decrypt.php:18 Трассировка стека: #0 C:\xampp\htdocs\encrypter\decrypt.php(18):odium_crypto_pwhash() #1 {main} в C: \ xampp \ htdocs \ encrypter \ decrypt.php в строке 18
Я пытался скопировать некоторые строки в коде шифрования, но не получилось.
Я также получаю предупреждение.
Но я не знаю, является ли это причиной. Я также получаю это при шифровании.
Предупреждение: unpack(): коды 64-битного формата недоступны для 32-битных версий PHP в C: \ xampp \ htdocs \ encrypter \ decrypt.php в строке 11
Предупреждение: unpack(): коды 64-битного формата недоступны для 32-битных версий PHP в C: \ xampp \ htdocs \ encrypter \ decrypt.php в строке 12
ОБНОВИТЬ
Предупреждение исправляется изменением кода pack () с
P
вV
,После изменения кода
$opslimit
имеет значение больше 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');
}
Это исходный код, который я использую из примера libsodium.
1 ответ
Код действительно не был предназначен для 32-битных версий PHP.
Если вы измените P
в V
, вам нужно:
- Сделайте это как в звонках
unpack()
и звонки вpack()
- Измените количество прочитанных / записанных байтов с 8 на 4.
Но лучше всего было бы попытаться понять, что делает код.
Он хранит лимит памяти и итерации в начале файла, так что эти параметры могут быть восстановлены позже при чтении файла без необходимости их жесткого кодирования.
pack()
кодирует значение в фиксированном количестве байтов. unpack()
делает обратное.pack('P')
кодирует 64-битное значение в 8 байтов. unpack('P')
читает 8 байтов и преобразует их в значение.
Если ваша среда не поддерживает 64-битные значения, упакуйте / распакуйте в 4 байта, но вам нужно записать 4 байта, а не 8. И прочитать также 4 байта, а не 8.