1、遇到问题
1.1、情况1
PublicKey对象创建失败
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
1.2、情况2
转换出现乱码
�>%�n+At��gm�X'�o�1>m��WSO~���O<l@��t�U���~-��1D6�~$�|�5O�P���O��:Ӝ�ק�F8\�_��P�J�ޗ�w*�gJS;�O��>��,�G_gt���#��
2、正确的用法
服务端生成publickKey:
String publicKeyString = (new BASE64Encoder()).encodeBuffer(key);
客服端处理返回的publicKey:
/**
* Rsa加密算法公钥加密
*
* @param data 要加密的内容
* @param publicKey 公钥
* @return byte[]
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 获取公钥对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKey, Base64.DEFAULT));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
// 加密数据
Cipher cp = Cipher.getInstance(TRANSFORMATION);
cp.init(Cipher.ENCRYPT_MODE, pubKey);
return cp.doFinal(data);
}
/**
* 解密使用PKCS8EncodedKeySpec:
* Rsa加密算法私钥解密
*/
public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {
// 得到私钥对象
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey, Base64.DEFAULT));
KeyFactory kf = KeyFactory.getInstance(RSA);
PrivateKey keyPrivate = kf.generatePrivate(keySpec);
// 解密数据
Cipher cp = Cipher.getInstance(TRANSFORMATION);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr = cp.doFinal(encrypted);
return arr;
}
//调用方法
val rsaUserNameByte = StringUtil.encryptByPublicKey(userName.toByteArray(),publicKey!!.toByteArray())
//获取加密后的信息
val rsaUserNameStr = String(Base64.encode(rsaUserNameByte, Base64.DEFAULT))
原创不易,求个关注。
微信公众号:一粒尘埃的漫旅
里面有很多想对大家说的话,就像和朋友聊聊天。
写代码,做设计,聊生活,聊工作,聊职场。
我见到的世界是什么样子的?
搜索关注我吧。
公众号与博客的内容不同。