Я попытался выполнить шифрование RSA в javascript и расшифровать в java. Я говорил это в качестве примера (# 2 поста)Javascript не распознает RSAkey(), хотя js включен
KeyPairGenerator kpg;
try {
kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
yourVariablePublic = kp.getPublic();
yourVariablePublic = kp.getPrivate();
} catch(NoSuchAlgorithmException e) {
}
Теперь давайте двигаться к Java коду нашей текущей страницы:
// receiving public key from where you store it
Key publicKey = YourCarrierClass.getYourVariablePublic();
KeyFactory fact;
// initializing public key variable
RSAPublicKeySpec pub = new RSAPublicKeySpec(BigInteger.ZERO, BigInteger.ZERO);
try {
fact = KeyFactory.getInstance("RSA");
pub = fact.getKeySpec(publicKey, RSAPublicKeySpec.class);
} catch(NoSuchAlgorithmException e1) {
} catch(InvalidKeySpecException e) {
}
// now you should pass Modulus string onto your html(jsp) in such way
String htmlUsedModulus = pub.getModulus().toString(16);
// send somehow this String to page, so javascript can use it
И чтобы расшифровать его в Java-коде:
Key privateKey = YourCarrierClass.getYourVariablePrivate();
Cipher cipher;
BigInteger passwordInt = new BigInteger(ajaxSentPassword, 16);
byte[] dectyptedText = new byte[1];
try {
cipher = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS1Padding");
byte[] passwordBytes = passwordInt.toByteArray();
cipher.init(Cipher.DECRYPT_MODE, privateKey);
dectyptedText = cipher.doFinal(passwordBytes);
} catch(NoSuchAlgorithmException e) {
} catch(NoSuchPaddingException e) {
} catch(InvalidKeyException e) {
} catch(IllegalBlockSizeException e) {
} catch(BadPaddingException e) {
}
String passwordNew = new String(dectyptedText);
System.out.println("Password new " + passwordNew);
Как и в примере, я использовал следующий код в JavaScript
function sendPassword() {
var password = $('#passwordField').val();
var rsa = new RSAKey();
rsa.setPublic($('#keyModulus').text(), '10001');
var res = rsa.encrypt(password);
$('#ajaxSentPassword').val(res);
}
Я изменил часть генерации пары ключей с помощью метода Get servlet и сохранил значение, которое будет передано jsp в сеансе. И изменил часть расшифровки на метод POST сервлета. Я получаю эти ключи для дешифрования, получая из сеанса. Это только для моего обучения, и я понимаю, что он будет уязвим, если он будет реализован в режиме реального времени. Это должно учиться на основах для меня.
Проблема в том, что в коде javascript он не распознает RSAkey(), я получил как «Неподготовленную опорную ошибку: RSAKey() не определен». Кто-нибудь знает, что такое .js-файл, используемый для этого примера. Я попробовал jsencrypt.js, который показывает как «Неподготовленная эталонная ошибка: RSAKey() не определен», и если я использую файл rsa.js - я получил ошибку Invalid RSA Public Key. Не указано, какой файл .js используется им.
Это также можно найти здесь (второй ответ)
Encrypt a small string with RSA in javascript then decrypt in java on server
Но вы уже нашли альтернативу в библиотеке jsencrypt, поэтому следуйте ее документации и напишите надлежащий соответствующий код, вместо того, чтобы полагаться на неопределенный поток stackoverflow, где ответ фактически не принимается. – Gimby
1) Почему PKCS # 1v1.5 заполняется? Он слабый. 2) Зачем вообще беспокоиться? TLS уже шифрует пароль в пути. И без TLS злоумышленник может просто добавить дополнительный javascript, который просочится в простой пароль. – CodesInChaos
@CodesInChaos jsbn и jsencrypt, похоже, не реализуют OAEP. –