Шифрование RSA с помощью OAEP между Java и JavaScript - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь зашифровать короткую строку в JavaScript и расшифровать ее в Java.Расшифровка не удалась, и я думаю, что это из-за разницы в блочном режиме и / или заполнении между двумя платформами.Я попытался зашифровать одну и ту же строку как в Java, так и в JavaScript, и получил разные результаты, которые указывают на то, что разница действительно есть.Вот код Java, который создает ключ:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();

А вот код Java, который я использовал для проверки шифрования:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] bytes = cipher.doFinal("asdf".getBytes());

Я отправляю открытый ключ наОбработайте JavaScript и преобразуйте его в ArrayBuffer с именем переменной publicKey.Я убедился, что ключ на стороне JavaScript совпадает с ключом на стороне Java (экспортировав его с crypto.subtle.exportKey и изучив байты).Вот код JavaScript, который я использовал для проверки шифрования:

crypto.subtle.importKey('spki', publicKey,
                        {hash: 'SHA-256', name: 'RSA-OAEP'}, true,
                        ['encrypt'])
      .then((key) => {
        crypto.subtle.encrypt({name: 'RSA-OAEP'}, key,
                              new TextEncoder().encode('asdf'))
              .then((buffer) => {

              });
      });

Содержимое байтового массива в Java и буфера массива в JavaScript не совпадают.Настройки, в которых я не уверен, это параметр Cipher#getInstance на стороне Java и параметры importKey и encrypt на стороне JavaScript.Есть ли какие-нибудь настройки, которые будут работать между Java и JavaScript, используя встроенные классы?Или мне стоит посмотреть сторонние библиотеки (например, Bouncy Castle)?

1 Ответ

0 голосов
/ 05 апреля 2019

Похоже, что встроенное шифрование / дешифрование в JavaScript и Java не имеет совместимых настроек для шифрования RSA.Жизнеспособным решением является библиотека кузниц из github ( forge на github ).Основные настройки описаны на странице github следующим образом ( Примеры RSA ):

// encrypt data with a public key using RSAES-OAEP/SHA-256/MGF1-SHA-1
// compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha1.create()
  }
});
...