Не удалось расшифровать Rsa с помощью закрытого ключа на PHP

#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#