我试图在javascript中进行RSA加密,并在java中进行解密。我以这个为例(#2帖子)
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);
}
我用Servlet的Get方法更改了密钥对生成部分,并存储了要在会话中传递给jsp的值。并将解密部分更改为Servlet的POST方法。我确实通过从会话中获取来解密的那些密钥。这只是为了我的学习,我确实意识到,如果实时实施,它将很容易受到攻击。这是我的基础知识。
问题是,在javascript代码中,它无法识别RSAkey(),出现“未捕获的参考错误:未定义RSAKey()”。有谁知道该示例使用的.js文件是什么。我尝试了jsencrypt.js,它显示为“未捕获的参考错误:未定义RSAKey()”,如果我使用rsa.js文件,则会收到无效的RSA公钥错误。没有说明他使用了哪个.js文件。
也可以在这里找到(第二个答案)
Encrypt a small string with RSA in javascript then decrypt in java on server
最佳答案
如果使用jsencrypt,则需要使用其API:
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
var encrypted = encrypt.encrypt($('#input').val());
尽管它使用jsbn库,但我认为它不是公开的。因此,
RSAKey
将不存在。如果要直接使用jsbn,则可以引用RSAKey
。