2015-01-27 3 views
1

Я попытался выполнить шифрование RSA в javascript и расшифровать в java. Я говорил это в качестве примера (# 2 поста)Javascript не распознает RSAkey(), хотя js включен

http://www.wenda.io/questions/5025740/encrypt-a-small-string-with-rsa-in-javascript-then-decrypt-in-java-on-server.html

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

+0

Но вы уже нашли альтернативу в библиотеке jsencrypt, поэтому следуйте ее документации и напишите надлежащий соответствующий код, вместо того, чтобы полагаться на неопределенный поток stackoverflow, где ответ фактически не принимается. – Gimby

+0

1) Почему PKCS # 1v1.5 заполняется? Он слабый. 2) Зачем вообще беспокоиться? TLS уже шифрует пароль в пути. И без TLS злоумышленник может просто добавить дополнительный javascript, который просочится в простой пароль. – CodesInChaos

+0

@CodesInChaos jsbn и jsencrypt, похоже, не реализуют OAEP. –

ответ

0

Если вы используете jsencrypt, то вам нужно использовать его API:

var encrypt = new JSEncrypt(); 
encrypt.setPublicKey($('#pubkey').val()); 
var encrypted = encrypt.encrypt($('#input').val()); 

Хотя он использует jsbn библиотеку, Я не думаю, что это разоблачено. Итак, RSAKey не будет. Если вы хотите использовать jsbn напрямую, вы получите ссылку на RSAKey.

Смежные вопросы