可以交换 RSA 密钥吗?

信息安全 密码学 RSA
2021-09-01 01:31:01

在理论上,公钥和私钥有什么本质上的不同吗?

在生成 RSA 密钥期间,会生成两个密钥,密钥 A 和密钥 B。密钥 A 是私有密钥,密钥 B 是公共密钥。密钥 B 可以是私有的,而密钥 A 可以是公开的吗?

  • 选择哪个密钥是私有的是任意的吗?
  • 在另一个公开的情况下,任何一个密钥都会与私有密钥一样好用吗?
  • 是否有一些数学属性需要密钥 A 是私有的?

我知道磁盘格式不同,我不能只重命名文件。但我说的是没有任何编码、格式或元数据的原始二进制密钥。

3个回答

在 RSA 中有三个重要的组件:

  • 公共指数
  • 私人指数
  • 一个通用模数(与私钥和公钥一起使用)

因此,公钥由公钥和模数组成,而私钥由私钥和模数组成。

但是通常实现事物的方式,公共指数几乎总是0x10001-每个键的值相同。所以只有模数是唯一的。

然后,您可以看到在这里交换私钥和公钥是多么有问题。如果每个人的秘密都是0x10001,那将不是什么秘密。因此,我们保留了不太容易预测的指数秘密,并将称为私钥。

在数学上,RSA 密钥对是一个数字n,它是两个大的可能素数pq的乘积,以及一对数字 ( d , e ),使得d × e - 1 是 ( p - 1) × ( q - 1)。数字de被称为指数(原因我们稍后会看到)。还有一些约束,但它们对称地处理de 。公钥是一对数字(ne),私钥是一对数字(n, d )。

(私钥文件通常不仅仅包含nd,但这是具体格式的问题,而且私钥文件通常也包含公钥。)

所以在这方面,是的,可以交换 RSA 密钥。

但是,公钥/私钥对的要点是其中一个密钥保持秘密,而另一个密钥公开。数字n必须在两边都使用,所以它是公开的。其中的dë -按照惯例,一个写d -是保密的和ē成为公众。如果d要保密,一定不容易猜到。

RSA 操作的核心是将一个大数(大约与密钥大小一样多的位)提高到de的幂。这是一个昂贵(缓慢)的操作,因此最好选择de以使其不会太慢。这需要使de 变小(或者在其二进制表示中将少数位设置为 1 的次优)。然而,如果你把d变小,你就可以通过枚举来猜测它。因此,私人指数d必须很大。另一方面,e可以保持小;由于数学原因,它必须是奇数,不能是 1,但 3 是一个非常好的选择,也是第二常见的选择。由于历史原因, e最常见的选择是65537,即二进制的10000000000000001。

因此,在一个 RSA 密钥对中,因为有充分的理由在实践中完成,给定私钥(nd ),人们可以通过猜测e的可能值(是 65537?如果不是, )找到公钥(ne )。是3吗?如果不是,多尝试几个小数字。)因此,公钥和私钥不能互换。

请注意,这是 RSA 的属性。其他一些公钥算法(例如 DSA)具有位于不同数学空间中的公钥和私钥。

下面的描述适用于 RSA 公钥加密。公钥是 (e, n)对,私钥是 (d, n),其中 n 是 2 个大素数的乘积。e 和 d 是乘法逆元。

令 x ^ y 表示 x 的 y 次幂 mod n。所有操作均以 mod n 执行

取消息 m,其中 m < n。由于 e 和 d 是乘法逆元,

 (m ^ e) ^ d is equal to m
 (m ^ d) ^ e is also equal to m

因此,就数学而言,e 或 d 没有什么特别之处e是公钥的一部分,是一个很小的数字,通常是3或65537,而d是私钥的一部分,是e的乘法逆元,将是一个巨大的随机数。您希望私钥是一个无法猜测的巨大随机数,而获得 d 的唯一方法是分解 n,这对于大 n 而言在计算上是不可行的。

您通过计算 (m ^ e) 来加密消息。称之为c。你通过计算 (c ^ d) 来解密,这会给你 m。由于 e 比 d 小得多,因此使用 RSA 加密消息比解密消息要快得多。

实际上,您在签名时采用了另一种方式——通常是对消息的散列进行签名。h = hash(m) 计算 s = (h ^ d) 得到 hash 的签名。您通过计算 s ^ e 来验证签名以返回 h。