#php #rsa
#php #rsa
Вопрос:
привет, я получаю ошибку при расшифровке RSA с закрытым ключом выше PHP, пожалуйста, помогите (я пытаюсь расшифровать на c# закрытый ключ работает нормально)
Ошибка
error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed
PHP
class RSA{ protected $private; public function __construct() { $this-gt;private = @file_get_contents("private.pem"); } public function decrypt($data) { if (is_null($data) || empty($data) || is_string($data) === false) { throw new RuntimeException('Needless to encrypt.'); } elseif (is_null($this-gt;private) || empty($this-gt;private)) { throw new RuntimeException('You need to set the private key.'); } $key = openssl_get_privatekey($this-gt;private); if (!openssl_private_decrypt(base64_decode($data), $result, $key)){ throw new Exception(openssl_error_string()); } return $result; } }
Комментарии:
1. Разделите это на Вопрос и Ответ. Тогда люди будут знать, где искать ответ
Ответ №1:
Я решил свою проблему, я не знаю почему, это должно быть потому, что моя закодированная строка содержит недопустимые символы, поэтому, когда я отправляю GET или POST, она терпит неудачу, поэтому мое решение состоит в том, чтобы использовать функцию toHex () для кодирования данных в шестнадцатеричной форме и отправки их, а при получении данных используйте toStr (), чтобы декодировать их обратно.
public function toHex($string){ $hex=''; for ($i=0; $i lt; strlen($string); $i ){ $hex .= dechex(ord($string[$i])); } return $hex; } public function toStr($hex){ $string=''; for ($i=0; $i lt; strlen($hex)-1; $i =2){ $string .= chr(hexdec($hex[$i].$hex[$i 1])); } return $string; }
C#
public static string ToHex(string str) { var sb = new StringBuilder(); var bytes = Encoding.UTF8.GetBytes(str); foreach (var t in bytes) { sb.Append(t.ToString("X2")); } return sb.ToString(); } public static string FromHexString(string hexString) { var bytes = new byte[hexString.Length / 2]; for (var i = 0; i lt; bytes.Length; i ) { bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } return Encoding.UTF8.GetString(bytes); }
расшифровка закрытого ключа правка
openssl_private_decrypt(base64_decode($this-gt;toStr($data)), $result, $key)
Комментарии:
1. отправь это … откуда? Куда?
2. @PresidentJamesK. Полк здесь я использую отправку с клиента c# на PHP-сервер
3. Но ваша
toHex()
функция написана на php!4. @PresidentJamesK. Полк Вы можете просмотреть ответ, который я отредактировал и добавил код c#