前言
RSA是一种非对称加解密算法,非对称意思是加密秘钥和解密秘钥是两个;
秘钥分为公钥和私钥,我们可以通过私钥推导出公钥,但是不能用公钥推导出私钥,所以公钥是能被公开的秘钥,而私钥是不能被公开的秘钥;
秘钥至少为500位以上,一般推荐使用1024bit,个别机构使用的2048bit(比如CA-美国化学文摘)
目前为止512bit和768bit的rsa秘钥分别在1999年和2009年12月12日被破解,所以至少要使用1024bit
RSA是一种可以对数据和数字签名进行加密的算法,但是因为秘钥太长,所以通常数据使用对称加密,而秘钥使用RSA加密
在java中如何使用
在java中使用RSA算法加解密,可以参考Ico项目中的代码,位于ico.ico.security包下,下面记录几个碰到的问题
私钥加密公钥解密出现神秘字符
在本地测试中,我们自己加密并解密,是正常的,但是服务器加密,客户端解密,解密出来的明文,起始位置会出现很多的神秘字符
解决方案可以参考项目中的Util代码,着重查看Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
出现神秘代码是由于之前这里传入的字符为RSA
,使用RSA/ECB/PKCS1Padding
算法就不会出现这个问题
但是要注意的是秘钥的算法,也就是KeyFactory kf = KeyFactory.getInstance(ENCRYPT_ALGORITHM);
这里使用的依旧是RSA
私钥不能用于加密|公钥不能用于解密
通常这些错误下面第一行可以看到底层使用的算法提供商,我这里是com.ibm.crypto.provider
,这说明使用了ibm的算法提供商,我们需要替换算法提供商
参考项目代码,在加密解密前替换提供商
//替换提供商,部分环境使用ibm的算法提供商,可能会不支持私钥加密
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
再次运行,就正常了