#javascript #node.js #encryption #rsa #jsencrypt
#javascript #node.js #шифрование #rsa #jsencrypt — шифрование
Вопрос:
Я пишу веб-приложение, которое получает зашифрованный ответ RSA от сервера. Ему необходимо расшифровать этот файл.
До сих пор я пытался использовать JSEncrypt для расшифровки файла во внешнем интерфейсе. Проблема, похоже, в том, что серверная часть не шифрует файл должным образом. Если я помещу как закрытый, так и открытый ключ во внешний интерфейс, я смогу успешно зашифровать и расшифровать. Проблема, похоже, в том, как я шифрую ответ. Когда я читаю в файле в NodeJS и шифрую файл следующим кодом:
fs.readFile("rsaPublicKey", "utf8", (err, data) => {
if (err) throw err;
pubKey = data;
});
encryptedMessage = crypto.publicEncrypt(
{
key: pubKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
Buffer.from(message)
);
res.send({"response": encryptedMessage.toString("base64")});
Сообщение больше, чем то же сообщение, зашифрованное с помощью JSEncrypt.
Узел.Сообщение JS: WLptALzMMws/Qj8qzeYkQ1NyRknoBGX0 oHmtzd0Cwl/RmWnwt6wSJ1qdbk5GMPcEML5iqCISqTfPTSEC6M37KIJAgGLViPENKcvonT7qQbMsn0yftFMl9grn1oLQz567t3lWpdyuCa99xqG tGsAAOK84HHCW nprSH6 7olysTnSzzZWvvBl6VGTpmwtoBEGOnZ5C/XLwiW7b2UuzHsksIA1s55OkJMOOUA6neZiJIzHsJSHZGgigKvKwYNQbjhmEBbdNVSvCPIE/d9dpTtWNABcnQX7SCA6/sTZH/f0OnGGXOyYabhq84fdw/WwpouUBWsRQLQYJgKy3EqY/y/w==
Сообщение JSEncrypt: Sq9KQyp7KDqy1CBFRLtXm4ZAdxidgUNlp0d6X6xm3m aBXKv4H7DVu0O40EMWeSWl3dQcBBC/oguJsoAz/GY//77ElIPIRuvPK4YIWPNq2fjoIgIs3Ew4I5TKAP4rph//NSlDLPc4ppXQjj/YO2238EHney9Wxxa9EZzE/p48arkxuEjB0gakWyVgTlF8x6H7LGsD4epS7RWJ0ua1kG1J6ZuMB82qBvq2MugLEuQamAfml4LtwWYFTJ/dIcAqVqrtHe6/F2oNGwXsE2GDEeZcFr4vTkejCs5dFcbbcgg/KVnROdGQHJlDGl0uUBy/2UNml3cT3FocjXkPGJa0zu3/g==
Есть ли какой-нибудь способ попытаться заставить это работать?
Комментарии:
1. Сообщение больше, чем одно и то же сообщение, зашифрованное с помощью JSEncrypt: оба сообщения имеют одинаковый размер, то есть 32 байта после декодирования Base64.
2. JSEncrypt поддерживает только заполнение PKCS # 1 версии v1.5, но не OAEP, здесь . В коде NodeJS применяется OAEP. Для совместимости обе стороны должны использовать одинаковое заполнение. Дополнение PKCS # 1 версии v1.5 может быть применено в коде NodeJS с
crypto.constants.RSA_PKCS1_PADDING
помощью .3. @Topaco спасибо вам за это! Теперь это работает, но мне было интересно, есть ли какие-либо библиотеки Javascript, которые могут расшифровывать заполнение OAEP? Извините за это, я очень новичок в шифровании, и мне следовало бы ознакомиться с RSA, прежде чем пытаться его реализовать.
4. Одной из возможностей может быть Web Crypto API . Библиотека не проста в использовании, но есть примеры . Как правило, рекомендации библиотеки не по теме на SO. Поэтому вам также следует поискать в Интернете, чтобы узнать, сможете ли вы найти библиотеку, наиболее подходящую для ваших нужд.
Ответ №1:
Вы можете попробовать мою недавно модифицированную версию jsencrypt.
У меня возникла противоположная проблема: шифрование с помощью клиентской части с закрытым ключом не расшифровывалось серверной частью .net с использованием bouncycastle.
Я произвел некоторую очистку кода и пересмотрел дополнения, чтобы они были совместимы для стендовых случаев.
Попробуйте и дайте мне знать: https://github.com/michaeldisaro/JSEncrypt
Ответ №2:
Оказывается, JSEncrypt не поддерживает заполнение, которое я использовал в серверной части. Я изменил заполнение в серверной crypto.constants.RSA_PKCS1_PADDING
части, как показано Topaco в комментариях. Другим возможным вариантом было бы использовать https://github.com/michaeldisaro/JSEncrypt и снова используйте заполнение OAEP.