На клиенте у меня есть строка, которую я шифрую с помощью открытого ключа. После того, как строка зашифрована, я кодирую ее как 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-----"
}
Код: Выделить всё
Error decrypting keys error:0200009F:rsa routines::pkcs decoding error
Исходя из моего устранения неполадок, моя проблема, похоже, заключается в следующем. если я закодирую зашифрованную строку в base64, а затем попытаюсь декодировать вывод расшифрованной строки в кодировке base64, расшифровка завершится с ошибкой декодирования rsa, указанной выше.
Я подтвердил это, зашифровав строку с помощью openssl, base64 кодирует зашифрованный вывод, затем обновляет мой PHP-код до декодирования base64, а затем пытается расшифровать декодированные данные, и это также терпит неудачу, но если я просто передаю зашифрованные данные без кодирования, все в порядке. Кажется, я не могу понять, что происходит.
Я провел еще один тест, в котором я преобразовал зашифрованный файл в шестнадцатеричный формат вместо кодирования base64, а затем преобразовал его обратно в bin, и это кажется работать нормально.
Полагаю, у меня есть способ сделать это, но может ли кто-нибудь сказать мне, почему я не могу кодировать base64 зашифрованные данные для передачи и правильно расшифровывать? Или я могу просто сделать что-то не так?
Изменить: вот несколько примеров фрагментов кода;
$cipher шифруется на стороне клиента, а затем кодируется в base64. отправляется на сервер через конечную точку API в теле JSON. то есть;
Код: Выделить всё
{
"keys":
}
Код: Выделить всё
openssl genrsa -aes256 -out private.pem 2048
openssl rsa -in private.pem -pubout > public.pem
Код: Выделить всё
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