RSA 使用 JSEncrypt 加密并使用 BouncyCastle 解密 (Java)
RSA encrypt using JSEncrypt and decrypt using 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: Illegal hexadecimal character I at index 0
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,我已经设置好了。我还能缺少什么?
错误发生在Hex.decodeHex()
方法中,这意味着您的数据不是十六进制编码的字符串。
JSEncrypt.encrypt()
方法 returns Base64 中的加密数据(而不是十六进制字符串)。为了解密它,你必须从base64格式解码它。
所以代替:
byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray()));
这样做:
byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray()));
您也可以只从客户端解决这个问题。请看下面的代码:
let encrypt = new Encrypt.JSEncrypt();
encrypt.setPublicKey(this.publicKey);
encrypt.getKey().encrypt(password);
只需在 encrypt
后添加 getKey()
。它对我有用!我使用这种方法将我的密码加密为十六进制字符串。
这可能与
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: Illegal hexadecimal character I at index 0 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,我已经设置好了。我还能缺少什么?
错误发生在Hex.decodeHex()
方法中,这意味着您的数据不是十六进制编码的字符串。
JSEncrypt.encrypt()
方法 returns Base64 中的加密数据(而不是十六进制字符串)。为了解密它,你必须从base64格式解码它。
所以代替:
byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray()));
这样做:
byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray()));
您也可以只从客户端解决这个问题。请看下面的代码:
let encrypt = new Encrypt.JSEncrypt();
encrypt.setPublicKey(this.publicKey);
encrypt.getKey().encrypt(password);
只需在 encrypt
后添加 getKey()
。它对我有用!我使用这种方法将我的密码加密为十六进制字符串。