Расшифровка RSA с помощью JavaScript

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