У меня очень странная проблема с самодельной функцией decryptfile.
Я хочу расшифровать mp3-файл, который зашифрован нашей собственной программой Delphi.
После расшифровки этой песни с помощью php данные немного отличаются от расшифровки с помощью Delphi. Это приводит к разнице в размерах файлов по сравнению с Delphi и php.
Это происходит с каждым файлом, который мы расшифровываем, поэтому чтение последних 578 байтов не всегда одинаково.
Пример наших результатов:
Taginfo:filename: 180519: size: 7342031 bytes (Delphi decrypted)
TAGStolen danceMilky ChanceLICHTDICHT RECORDS#$#$2013000000100001000000000000000000000000000000000000000000000, 840900000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000Taginfo:filename: 180519: size: 7342032 bytes (PHP decrypted)
AGStolen danceMilky ChanceLICHTDICHT RECORDS#$#$2013000000100001000000000000000000000000000000000000000000000, 8409000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000T�8߂�j#���#6&
Difference in size: -1
Вы можете видеть, что данные не равны, и, кроме того, данные PHP в конце отличаются.
Вот моя функция:
require_once('mp3file.class.php');
function decryptfile($str){
//read salt
$salt = substr($str, 0, 8); //salt ok
$str_out = substr($str, 8); //encrypted data
//read key
$k = '';
$bytes = array(*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *);
$string = "";
foreach ($bytes as $chr) {
$string .= chr($chr);
}
$key = $string;
//fill hash
$ctx = hash_init('sha512');
hash_update($ctx, $salt);
hash_update($ctx, $key);
$xkey = hash_final($ctx, true);
//assing key
$k = substr($xkey, 0, 32);
//iv
$iv = '';
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv_array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
$string = "";
foreach ($iv_array as $chr) {
$iv .= chr($chr);
}
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $k, $str_out, MCRYPT_MODE_CBC,$iv);
//$pad = ord($str[($len = strlen($str)) - 1]);
return rtrim($str, "\0");
//return substr($str, 0, strlen($str)-$pad);
}$farray = scandir('/var/www/html/test/in/');
foreach ($farray as $item) {
if (($item != '.') && ($item != '..')) {
$filename = "test/in/".$item;
$filename2 = "test/out/".$item;
$filename2b = "test/out/".$item.".mp3";
$enc = file_get_contents($filename);
$jak = decryptfile($enc);
$dec = fopen($filename2b, "w");
fwrite($dec, $jak);
fclose($dec);
$strfile1 = "filename: " . $item . ': size: ' . filesize($filename2) . ' bytes (Delphi decrypted)<br>';
$strfile2 = "filename: " . $item . ': size: ' . filesize($filename2b) . ' bytes (PHP decrypted)<br>';
$v1 = filesize($filename2);
$v2 = filesize($filename2b);
$v1 = $v1-$v2;
echo '<br>Taginfo:'. $strfile1. '<br>';
$dec = file_get_contents($filename2);
$dec2 = file_get_contents($filename2b);
echo substr($dec, -578);
echo '<br><br>';
echo '<br>Taginfo:'. $strfile2. '<br>';
echo substr($dec2, -578). '<br>';
echo '<br>Difference in size: '.$v1 . '<br>';
echo 'original header:<br>';
$m = new mp3file($filename2);
$a = $m->get_metadata();
if ($a['Encoding']=='Unknown')
$str = "?";
else if ($a['Encoding']=='VBR')
$str = print_r($a);
else if ($a['Encoding']=='CBR')
$str = print_r($a);
unset($a);
echo '<br><br>';
echo 'decrypted header:<br>';
$m = new mp3file($filename2b);
$a = $m->get_metadata();
if ($a['Encoding']=='Unknown')
$str = "?";
else if ($a['Encoding']=='VBR')
$str = print_r($a);
else if ($a['Encoding']=='CBR')
$str = print_r($a);
unset($a);
echo '<br><br>';
}
}
exit;
Может кто-нибудь объяснить мне, в чем здесь проблема?
Задача ещё не решена.
Других решений пока нет …