Я пытаюсь зашифровать короткую строку в 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)?