Я пытаюсь создать WS для запроса мыла. В теле сообщения есть поле, содержащее зашифрованный текст.
У меня есть открытый ключ для шифрования текста, но единственный результат, который я получаю, — это то, что текст не распознается.
Я использую криптомодуль узла для выполнения запроса, и текст зашифрован, но я не знаю, почему не зашифровано исправление.
PS Я сделал то же самое на PHP с функцией openssl_public_encrypt и работает. Но я должен сделать это в node.js.
Любая идея или предложение? Чем openssl_public_encrypt отличается от функции crypto.publicEncrypt?
Вот зашифрованная часть в node.js:
var crypto = require("crypto");
var fs = require('fs');
fs.readFile("./certificate.pem", 'utf8', function (err, data) {
var bufferToEncrypt = new Buffer("textToEncrypt");
var encrypted = crypto.publicEncrypt({"key":data, padding:crypto.RSA_NO_PADDING}, bufferToEncrypt).toString("base64");
console.log(encrypted); // length 128
}
То же самое в php:
<?php
$publicKey = "./certificate.pem";
$plaintext = "textToEncrypt";
openssl_public_encrypt($plaintext, $encrypted, $publicKey);
echo base64_encode($encrypted); //encrypted string length 128
?>
У меня нет личного ключа для расшифровки текста, у меня есть только открытый ключ.
Также обратите внимание, что длина зашифрованного текста (в base64) одинакова в php и в node.js.
Я думаю, что заполнение это ваша проблема. В node.js вы указываете padding:crypto.RSA_NO_PADDING
, При поиске документа openssl_public_encrypt()
он говорит, что использует OPENSSL_PKCS1_PADDING
по умолчанию. Попробуйте следующее:
var constants = require("constants");
var encrypted = crypto.publicEncrypt({"key":data,
padding:constants.RSA_PKCS1_PADDING}, bufferToEncrypt).toString("base64");
Я подготовил демо онлайн:
$encrypted_encoded
на Пример расшифровки PHPСовет: как правило, не используйте асимметричное шифрование для реальных сообщений. Используйте его для защиты симметричного ключа. Однако ваш вариант использования может быть действительным, я просто хочу заявить об этом каждый раз, когда кто-то говорит о шифровании RSA.
Других решений пока нет …