Невозможно расшифровать зашифрованную строку с открытым ключом из тела json PHP.Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно расшифровать зашифрованную строку с открытым ключом из тела json PHP.

Сообщение Anonymous »

Я изо всех сил пытался расшифровать строку, зашифрованную открытым ключом, когда она была отправлена ​​в теле json, закодированном с использованием base64.
На клиенте у меня есть строка, которую я шифрую с помощью открытого ключа. После того, как строка зашифрована, я кодирую ее как base64, экранирую строку, затем включаю ее в качестве параметра в тело JSON, а затем отправляю на сервер через метод POST конечной точки API. Запрос выглядит примерно так;

Код: Выделить всё

{
"token":"d154c65681d38db24bffec2c70c034580b8bfadcb62b1952c4bd9f4d88414a02",
"key":"-----BEGIN CERTIFICATE-----\r\nRjt2BQNJVKUqXA\/aoQghnxdCjKT\/ZZUSL2Ll\/kauB+Y3kJCWNL7CfoWI8aPnBu7F\r\nrexvIWnS\/HLNR+uAc5Fs7wir6bT0SY1cF9ZVxzVZlZD16KGX94sxwN=WSpWcemyu4B\r\nWk5348OjME9I23tIwm9tb3BcX33LDr3CJAH5\/lsk5QnT95I6KZNkJzl26XW3+U6u\r\nFhuBPMr\/DrQXcwMHHEt8MswresrxZwSIUTzcQ7xag8n4JGnnoT8nVEuONhIM1\r\ntmF0h6PcmbK3G0zvdcoZw0k74w72\/oVOoHdq3Y+u4clxgFQNY+spQHFI1rE78Ovj\r\n1yAQm5nky9XNrJsy2PpqPg==\r\n-----END CERTIFICATE-----"
}
Когда данные получены сервером (PHP), данные уже не экранированы, поэтому все, что мне нужно сделать, это декодировать эту строку в base64, затем расшифровать с помощью openssl_private_decrypt(), и все должно все в порядке, но я не могу заставить расшифровку работать. Я постоянно получаю сообщение об ошибке;

Код: Выделить всё

Error decrypting keys error:0200009F:rsa routines::pkcs decoding error
Во время устранения неполадок я взял ту же строку, зашифровал ее с использованием того же открытого ключа с помощью openssl и сохранил ее в файл. Затем я обновил метод дешифрования на сервере, чтобы он считывал сохраненный файл вместо использования поля тела JSON, и он работает нормально.
Исходя из моего устранения неполадок, моя проблема, похоже, заключается в следующем. если я закодирую зашифрованную строку в base64, а затем попытаюсь декодировать вывод расшифрованной строки в кодировке base64, расшифровка завершится с ошибкой декодирования rsa, указанной выше.
Я подтвердил это, зашифровав строку с помощью openssl, base64 кодирует зашифрованный вывод, затем обновляет мой PHP-код до декодирования base64, а затем пытается расшифровать декодированные данные, и это также терпит неудачу, но если я просто передаю зашифрованные данные без кодирования, все в порядке. Кажется, я не могу понять, что происходит.
Я провел еще один тест, в котором я преобразовал зашифрованный файл в шестнадцатеричный формат вместо кодирования base64, а затем преобразовал его обратно в bin, и это кажется работать нормально.
Полагаю, у меня есть способ сделать это, но может ли кто-нибудь сказать мне, почему я не могу кодировать base64 зашифрованные данные для передачи и правильно расшифровывать? Или я могу просто сделать что-то не так?
Изменить: вот несколько примеров фрагментов кода;
$cipher шифруется на стороне клиента, а затем кодируется в base64. отправляется на сервер через конечную точку API в теле JSON. то есть;

Код: Выделить всё

{
"keys":
}
Для репликации сгенерируйте пару ключей RSA с помощью openssl;

Код: Выделить всё

openssl genrsa -aes256 -out private.pem 2048
openssl rsa -in private.pem -pubout > public.pem
вы можете использовать openssl для шифрования строки с использованием открытого ключа, который вы можете использовать в качестве шифра, который вы будете кодировать в base64;

Код: Выделить всё

openssl rsautl -encrypt -inkey public.pem -pubin -in string_to_encrypt.txt -out encrypted_string.enc

Код: Выделить всё

        //Read in the encrypted string from file
$cipherFile = fopen(
,"r");
$cipherStream = fread($cipherFile,8192);
$encodedCipher = base64_encode($cipherStream);
fclose($cipherFile);
$decodedCipher = base64_decode($cipherStream);
$privateKeyFile = fopen(,"r");
$privateKeyStream = fread($privateKeyFile,8192);
fclose($privateKeyFile);
$pkey = openssl_pkey_get_private($privateKeyStream,);
if (!$pkey) {
Log::error("Error extracting private key");
}
//The decryption always fails here
if (!openssl_private_decrypt($decodedCipher, $decryptedString, $pkey, OPENSSL_PKCS1_PADDING)) {
Log::error("Error decrypting keys " .  openssl_error_string());
return null;
}
Теперь, если вы измените

Код: Выделить всё

$encodedCipher = base64_encode($cipherStream);
//and
$decodedCipher = base64_decode($cipherStream);
в

Код: Выделить всё

$encodedCipher = bin2hex($cipherStream);
//and
$decodedCipher = hex2bin($cipherStream);
расшифровка прошла успешно

Подробнее здесь: https://stackoverflow.com/questions/790 ... n-body-php
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»