RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

我查了好多资料还是不懂。头晕了 rsa的加密和数字认证怎么结合起来,能不能具体说明一下。 还有公钥和私钥到底哪个才是用来加密和哪个用来解密?
关注者
1,715
被浏览
1,389,781

156 个回答

不要去硬记。

你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证

RSA 加密方案和 RSA 签名方案是不同的,具体的不同点在 @刘巍然-学酥回答里讲得很清楚。我在这里主要是想谈一下加密方案里的情况。

在 RSA 加密方案中,选定了 p,q 计算出 N=pq ,再在小于 \phi(N) 的正整数中选一个和它互素的 e 作为公钥,它模 \phi(N) 的乘法逆元 d 则为私钥。公开 e ,保留 d

结论:公钥 e 用来加密,私钥 d 用来解密。

想要反驳的是这个说法

私钥加密公钥可以解密
公钥加密私钥可以解密
两个大质数(p,q)乘积(n)难以逆向求解,所以pq是对等的,公钥和私钥也是对等的。
匿名用户:RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

这样说的话就有三种情形。我们一一分析:

一、公钥和私钥都保密

也就是说,Alice 和 Bob 同时分享一组密钥 (N,e,d) ,然后约定 ed 为加密密钥,另一个为解密密钥。这样做固然是可以的,但违背了公钥加密方案的初衷。公钥加密的设计就是为了公开加密密钥,让所有人都可以给某个人发送消息。

这种场景完全应该使用对称加密算法,加解密的效率和安全性都更高。

二、公钥公开,私钥保密

在这种情况下,用私钥加密公钥解密是不可能的。因为密码学的假设是:一个合格的加密方案,敌手拿到密文 c 不能恢复出明文 m 。这样做的结果是,所有人都可以解密信息,毫无意义。与之对应的有意义的是签名方案,具体参考开头我提到的刘巍然的答案。

三、公钥保密,私钥公开

这其实才是那个答案的意思:生成的公钥 e 和私钥 d 是对等的,只是两个数而已。把它们哪个公开出去用于加密,哪个保留起来用于解密,都是一样的。

但严格地讲,这种说法是错误的

对于最基本的 RSA 方案(即“教科书式的 RSA 方案”),这么做是可以顺利地完成加解密的。但是仅仅是理论上成立。因为在实际中,敌手可以利用各种可能的方法去攻击我们的密码方案。而为了避免这些攻击,我们对方案中每个参数的选取都有非常严格的要求。很自然地,公钥 e 和私钥 d 的要求就是截然不同的。比如说我按照密码标准生成了密钥,把公钥留下来解密,把私钥公布出去。在敌手眼中,我的公钥其实就是私钥,但这个公钥显然是不满足密码标准的要求的,所以敌手很可能可以破解我的密码方案。

比如说,我们的私钥不能太小。因为如果 d<N^{\frac{1}{4}} ,敌手就可以在 \log N 的线性时间内找到 d 。而公钥 e 也不能太小,但这里的不能太小只是为了抵挡广播攻击。对于 1024bit 的 N ,私钥 d 至少是 256bit 的(关于私钥 d 不能太小还有一个更 trivial 的原因,敌手可以通过枚举在至多 O(d) 的时间内得到 d );而 e 取 65537 也是允许的,这里的 e 只有 17bit 。

如果取一个 17bit 的私钥,你还能指望你的密码方案是安全的吗?impossible。

当然你可以说,我让公钥和私钥都达到 O(N^{\frac{1}{4}}) 的级别。且不说除此之外还会有别的要求,你要知道 RSA 的加解密都是要算很多大指数取模的,本来就很慢。 e 取 65537 就很好算(因为这数二进制就俩位置是 1),而解密的时候可以用中国剩余定理,所以省点时间(因为解密的人是允许知道 N 的分解的,他最后要计算的是 c^d\pmod N ,可以分别计算 c^d \pmod p,c^d \pmod q 再用中国剩余定理得到结果)。你这样让加密的人也得用 256bit 且不知道有几位是 1 的密钥加密,得浪费多少计算力,而且毫无意义啊。


综上所述,仅仅从最基础的原理角度,RSA 的公私钥互换也可以成功加解密。但实际上,公钥和私钥有完全不同的要求,这些要求保证了 RSA 加密方案尽可能地更安全高效。在这种情况下,公钥用来公开并加密,私钥用来保留解密,且不可互换