5

这可能是这个已回答问题的副本,但我似乎无法得到相同的结果。希望在这里得到一些指导。

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:org.apache.commons.codec.binary.Hex org.apache.commons.codec.binary.Hex.toDigit(Hex.java:178) 索引 0 处的非法十六进制字符 I .decodeHex(Hex.java:89)

我注意到的一件事是 JSEncrypt 加密文本的长度为 172,而服务器端的加密产生 256。

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

4

2 回答 2

3

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

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

所以而不是:

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

做这个:

byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray()));
于 2017-04-06T17:10:45.780 回答
0

您也可以仅从客户端解决此问题。请看下面的代码:

let encrypt = new Encrypt.JSEncrypt(); 
encrypt.setPublicKey(this.publicKey);
encrypt.getKey().encrypt(password);

getKey()后加就好encrypt。它对我有用!我使用这种方法将我的密码加密为十六进制字符串。

于 2018-09-20T07:47:38.770 回答