gpt4 book ai didi

java - RSA 使用 JSEncrypt 加密并使用 BouncyCaSTLe (Java) 解密

转载 作者:搜寻专家 更新时间:2023-10-30 20:43:19 45 4
gpt4 key购买 nike

这可能是 this answered question 的副本,但我似乎无法获得相同的结果。希望在这里得到一些指导。

JSEncrypt(客户端)

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

BouncyCaSTLe(服务器)- RSA key 生成

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() 方法返回 Base64 中的加密数据(而不是十六进制字符串)。为了解密它,您必须从 base64 格式对其进行解码。

所以代替:

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

这样做:

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

关于java - RSA 使用 JSEncrypt 加密并使用 BouncyCaSTLe (Java) 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256712/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com