2017-04-06 541 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

相關問題