2017-04-06 62 views
4

这可能与this answered question重复,但我似乎无法得到相同的结果。希望在这里得到一些指导。使用JSEncrypt进行RSA加密并使用BouncyCastle(Java)进行解密

JSEncrypt(客户端)

let encrypt = new Encrypt.JSEncrypt(); 
encrypt.setPublicKey(this.publicKey); // retrieved from server 
encrypt.encrypt(password); 

BouncyCastle的(服务器) - RSA密钥生成

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); 
generator.initialize(1024); 
KeyPair pair = generator.generateKeyPair(); 
PublicKey pubKey = pair.getPublic(); 
PrivateKey privKey = pair.getPrivate(); 

// returned to client 
String publicKeyStr = new String(Base64.encodeBase64(pubKey.getEncoded())); 
String privateKeyStr = new String(Base64.encodeBase64(privKey.getEncoded())); 

BouncyCastle的(服务器) - 解密

Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
// org.apache.commons.codec.binary.Hex 

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 
decrypted = new String(cipherText, BaseConstant.ENC_UTF8); 

错误

org.apache.commons.codec.DecoderException:位于索引0的非法十六进制字符I at org.apache.commons.codec.binary.Hex.toDigit(Hex.java:178) at org.apache.commons.codec .binary.Hex.decodeHex(Hex.java:89)

一两件事我注意到是通过JSEncrypt,这是172加密文本的长度,而在服务器侧加密产生256

的回答提到的问题是使用我已经设置的RSA/None/PKCS1Padding。还有什么我可以错过?

+0

唯一的例外是不相关的解密。 Hex.decodeHex()抛出异常 – Egl

+1

谢谢,但由@Hugo提供的解决方案是 – acys

回答

2

该错误发生在Hex.decodeHex()方法中,这意味着您的数据不是十六进制编码的字符串。

JSEncrypt.encrypt()方法返回Base64中的加密数据(而不是十六进制字符串)。为了解密它,你必须从base64格式解码它。

所以不是:

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 

这样做:

byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray())); 
+0

超级!这工作! – acys

+1

太棒了!如果它起作用并且你觉得它很有用,你可以upvote和/或接受答案(这不是强制性的,虽然是一个很好的做法) – 2017-04-07 17:24:30

+1

我尝试upvoting,但它说我没有足够的声望点:( – acys

相关问题