Я изо всех сил пытаюсь расшифровать некоторые значения на C #, зашифрованные в PHP. Шифрование в PHP выполняется следующим образом:
function encrypt($pure_string, $encryption_key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = 'fÔdñá1f¦';
$encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
$encrypted_string = base64_encode($encrypted_string);
return $encrypted_string;
}
Поскольку режим ECB используется IV, вероятно, он не используется, но все же это не помогает. Самая большая проблема заключается в том, что документация PHP настолько бедна и не указывает, какую кодировку используют функции! Передаваемая строка имеет разные байтовые значения в зависимости от кодировки, и в конечном итоге шифрование (в данном случае Blowfish) имеет дело с байтами.
Не зная кодировки, я просто пробую разные кодировки в своем коде C #, но безуспешно. Где-то я читал, что PHP использует внутреннюю кодировку "iso-8859-1", но даже при этом не работает.
Кому-нибудь удалось расшифровать на C # какое-то значение, зашифрованное в PHP с помощью глупой функции mcrypt_encrypt ()?
Обновить
Я сделал пример на PHP. Код:
define("ENCRYPTION_KEY", "1234asdf");
define("IV", "1#^ÊÁñÔ0");
$clearText = "abc";
function encrypt($pure_string, $encryption_key, $iv) {
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
$encrypted_string = base64_encode($encrypted_string);
return $encrypted_string;
}
$encrypted_string = encrypt($clearText, ENCRYPTION_KEY, IV);
echo "Key:" . ENCRYPTION_KEY . "<br />";
echo "IV:" . IV . "<br />";
echo "Clear Text:" . $clearText . "<br />";
echo "Encrypted Text:" . $encrypted_string . "<br />";
и результат:
Key:1234asdf
IV:1#^ÊÁñÔ0
Clear Text:abc
Encrypted Text:OiZ6QIdhXYk=
Также я подтвердил, что IV не используется, любое значение, которое я передаю, будет таким же.
utf8_encode
я смог расшифровать данные без этого танца кодирования (utf8 - ›iso8859-1 -› utf8). Это будет иметь эффект только в том случае, если данные для шифрования содержат более высокие символы, такие как знак евро «€» в моем примере. И да, я знаю, что вы НЕ контролируете часть php (вы говорили не раз;)), я только хотел показать, что это не ваша вина или проблема с криптобиблиотекой, которая расшифровывает данные так сложно, поскольку процесс шифрования мог быть лучше ... 10.11.2017