RSA加解密

本文详细介绍了RSA非对称加密算法的原理,强调了公钥和私钥的作用及安全性,指出至少使用1024bit秘钥长度的重要性,并分享了在Java中使用RSA遇到的常见问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


# 前言
RSA是一种非对称加解密算法,非对称意思是加密秘钥和解密秘钥是两个;

秘钥分为公钥和私钥,我们可以通过私钥推导出公钥,但是不能用公钥推导出私钥,所以公钥是能被公开的秘钥,而私钥是不能被公开的秘钥;

秘钥至少为500位以上,一般推荐使用1024bit,个别机构使用的2048bit(比如CA-美国化学文摘)

目前为止512bit和768bit的rsa秘钥分别在1999年和2009年12月12日被破解,所以至少要使用1024bit

RSA是一种可以对数据和数字签名进行加密的算法,但是因为秘钥太长,所以通常数据使用对称加密,而秘钥使用RSA加密

# 在java中如何使用
在java中使用RSA算法加解密,可以参考[Ico项目](https://github.com/ico10297024/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);
```
再次运行,就正常了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值