public static String rsaEncryptOAEP(String message, String publicKey)
throws IllegalBlockSizeException, IOException {
try {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] data = message.getBytes("utf-8");
byte[] cipherdata = cipher.doFinal(data);
return Base64.getEncoder().encodeToString(cipherdata);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
} catch (InvalidKeyException e) {
throw new IllegalArgumentException("无效的公钥", e);
} catch (IllegalBlockSizeException | BadPaddingException e) {
throw new IllegalBlockSizeException("加密原串的长度不能超过214字节");
}
}
想问下在使用微信支付公钥加密敏感信息的时候,微信官方的文档里面 cipher.init(Cipher.ENCRYPT_MODE, publicKey) init方法是支持publicKey传入一个字符串的,我复制到代码中之后
这个init方法是不支持publicKey是一个字符串的,必须是KEY类型的参数,想问下这是我包用的不对吗
这里是类型需要转换一下,可以参考下sdk的实现
https://github.com/wechatpay-apiv3/wechatpay-java/blob/main/core/src/main/java/com/wechat/pay/java/core/cipher/AbstractPrivacyEncryptor.java
这个坑我也遇到了,解决办法是:用sdk的时候直接传明文,sdk会帮自动加密。不需要咱们自己加密了。不然就会提示超长的错误