У меня возникла проблема при расшифровке файла с помощью 3DES. Файл остается точно таким же, кроме небольшого символа в конце файла. Я попытался изменить тип чтения файла, и это тоже не сработало. Это потенциально, потому что я меняю IV?
Вот мой шифрующий PHP-код:
$log = fopen($datalog, 'a') or die("can't open file");
//create a random IV to use with CBC encoding
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
echo " ";
echo "IP: ";
echo $address;
$enc_add = mcrypt_encrypt(MCRYPT_3DES, $key, $address, MCRYPT_MODE_CBC, $iv);
$add64 = base64_encode($enc_add);
fwrite ($log, $add64);
echo " ";
echo "INFO: ";
echo $info;
$enc_info = mcrypt_encrypt(MCRYPT_3DES, $key, $info, MCRYPT_MODE_CBC, $iv);
$info64 = base64_encode($enc_info);
fwrite ($log, $info64);
echo " ";
echo "TIMESTAMP: ";
echo $datetimeStamp;
$enc_ts = mcrypt_encrypt(MCRYPT_3DES, $key, $datetimeStamp, MCRYPT_MODE_CBC, $iv);
$ts64 = base64_encode($enc_ts);
fwrite ($log, $ts64);
echo " ";
echo "COUNTRY: ";
echo $country;
$enc_co = mcrypt_encrypt(MCRYPT_3DES, $key, $country, MCRYPT_MODE_CBC, $iv);
$country64 = base64_encode($enc_co);
fwrite ($log, $country64);
echo " ";
echo "LATITUDE: ";
echo $lat;
$enc_lat = mcrypt_encrypt(MCRYPT_3DES, $key, $lat, MCRYPT_MODE_CBC, $iv);
$lat64 = base64_encode($enc_lat);
fwrite ($log, $lat64);
echo " ";
echo "LONGITUDE: ";
echo $long;
$enc_long = mcrypt_encrypt(MCRYPT_3DES, $key, $long, MCRYPT_MODE_CBC, $iv);
$long64 = base64_encode($enc_long);
fwrite ($log, $long64);
//data related to ping
$enc_data = mcrypt_encrypt(MCRYPT_3DES, $key, $dataForIP, MCRYPT_MODE_CBC, $iv);
$data64 = base64_encode($enc_data);
fwrite ($log, $data64);
fclose($log);
}
Вот мой код для дешифрования:
if ($_POST['submit']) {
$file = $_POST["filename"];
$key = $_POST["key"];
$file_beingVerified = fopen($file, 'a+') or die ("can't open file");
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
while (!feof($file_beingVerified)) {
$str = fgets($file_beingVerified);
$reversed = base64_decode($str);
$enc_add = mcrypt_decrypt(MCRYPT_3DES, $key, $reversed, MCRYPT_MODE_CBC, $iv);
fwrite($file_beingVerified, $enc_add);
}
fclose($file_beingVerified);
}
В коде есть несколько проблем:
Файл следует читать следующим образом:
$str = '';
while (!feof($fileBeingVerified)) {
$str .= fread($fileBeingVerified, filesize($file));
}
При записи зашифрованных данных в файл откройте его с помощью режима "w", чтобы вы могли быть уверены, что файл не содержит другого содержимого.
$enc_add = rtrim($enc_add, "\0");
должно быть удалено: $enc_add = rtrim($enc_add, "\0");
См. Этот пример для справки:
<?php
$file = '/tmp/data';
$log = fopen($file, 'w') or die("can't open file");
$data = 'hello world';
$ivSize = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$key = 'my-secure-key';
$encData = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC, $iv);
$data64 = base64_encode($encData);
fwrite($log, $data64);
$fileBeingVerified = fopen($file, 'r') or die ("can't open file");
$str = '';
while (!feof($fileBeingVerified)) {
$str .= fread($fileBeingVerified, filesize($file));
}
$reversed = base64_decode($str);
$enc_add = mcrypt_decrypt(MCRYPT_3DES, $key, $reversed, MCRYPT_MODE_CBC, $iv);
$fileBeingVerified = fopen($file, 'w') or die ("can't open file");
fwrite($fileBeingVerified, $enc_add);
fclose($fileBeingVerified);
a+
- APPEND . RTFM : php.net/manual/en/function.fopen.php'a+' Open for reading and writing; place the file pointer at the end of the file.
Поэтому, когда вы читаете свои данные, вы читаете из конца файла.