【问题标题】:Why verify is quite faster than sign?为什么验证比签名快得多?
【发布时间】:2021-04-04 15:27:27
【问题描述】:

我尝试通过运行以下命令来测量 rsa 算法的性能:

$:openssl speed rsa

输出:

                sign    verify    sign/s verify/s
rsa  512 bits 0.000048s 0.000003s  20923.5 355236.0
rsa 1024 bits 0.000102s 0.000007s   9757.6 152852.6
rsa 2048 bits 0.000676s 0.000022s   1479.2  46028.3
rsa 3072 bits 0.002385s 0.000041s    419.3  24407.0
rsa 4096 bits 0.005083s 0.000069s    196.7  14392.3
rsa 7680 bits 0.041772s 0.000234s     23.9   4281.9
rsa 15360 bits 0.231628s 0.000960s      4.3   1041.6

正如我们从该命令的输出中看到的那样,验证操作所用的时间少于符号一 谁能解释一下为什么验证比签名快得多? 提前致谢!

【问题讨论】:

  • 因为公共指数通常是 3,7,65536 等,而私有指数在 1 和 phi(n) 之间是随机的
  • 这对我来说仍然很抽象,你能不能更清楚地解释一下

标签: openssl cryptography rsa verification signing


【解决方案1】:

我这里只讲 RSA 签名。

首先,RSA 公钥是一对(n,e),其中n 是模数,e 称为公共指数。

常见的 RSA 公共指数是 {3、5、17、257 或 65537}。原因很简单;验证成本可以控制在最低限度。例如,如果您选择3,那么它将需要 1 次乘法和 1 次平方与快速 moduluar squaring algorithm。如果您选择 65537 = 2^16+1,则需要 16 次平方和 1 次乘法。

现在,一旦您选择了您的公钥,私有指数d 就是一个随机整数e *d = 1 mod φ(n),出于安全考虑,我们希望采用这种方式。我们不想要小的d,因为它不安全。阅读这篇论文 Twenty Years of Attacks on the RSA Cryptosystem 中有关攻击的更多信息。

由于d 是随机的,如果我们使用Euler's totient function φ,那么平均需要φ(n)=(p-1)(q-1) 平方和φ(n)/2 乘法。这就是验证和签名成本差异的核心原因。

在没有适当填充和签名的情况下,不得使用 RSA,它必须与 RSA-PSS 一起使用(对于加密 OAEP 或 PKCS#5v.5 填充也是如此)


备注;

  1. 我们实际上使用Carmichael function 而不是欧拉函数,因为it always produces the smallest d

  2. RSA 可以使用 CRT 将私钥运算速度提高 4 倍,而 OpenSSL 就是以这种方式使用的。

  3. RSA 签名不是解密,如上所述,安全 RSA(不是教科书 RSA)必须使用适当的填充。

  4. 是的,首先我们选择公钥然后确保GCD(φ(n), e ) =1,如果没有选择新素数pq 其中n=p * q

【讨论】:

  • 明白了,感谢详细的解释
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2011-11-30
  • 2020-01-26
相关资源
最近更新 更多