DSA:如何生成次级抵押贷款?

时间:2011-12-02 01:07:22

标签: primes dsa

最近我对数字签名算法及其工作原理做了一些研究。我的问题对我来说不是实际问题,而是纯粹的兴趣。

但是,我很好奇如何在DSA中生成次级资产:在为算法生成参数期间,选择1024位素数p。下一步是找到一个160位素数q,它是p-1的除数。这就是我被卡住的地方。我不知道如何及时找到次级抵押贷款q,而不必永远等待。我也无法在互联网上找到有关DSA特定部分的任何文档,我发现的所有示例实现都使用库函数来创建参数。

有没有人更多地了解这次次级抵押贷款的产生,或者可以把我带到一个可以阅读它的地方?

提前致谢。

4 个答案:

答案 0 :(得分:3)

根据Zoredache的建议:在Digital Signature Standard中找到为DSA创建素数pq的算法。

允许L-1 = 160*n + b,其中b,n ∈ ℕ0 ≤ b < 160

  1. 选择一个随机数seed > 2¹⁶⁰。设gseed的长度。
  2. U = sha(seed) XOR sha(seed+1 mod 2^g)(其中sha是安全散列算法)
  3. q = U OR 2¹⁵⁹ OR 1
  4. 测试q是否为素数,如果不是,请转到第1步。
  5. counter = 0, offset = 2
  6. For k = 0,...,n: V_k = sha((seed + offset + k) mod 2^g)
  7. W = V_0 + V_1 * 2^160 + ... + V_(n-1) * 2^((n-1)*160) + (V_n mod 2^b) * 2^(n*160)
  8. X = W + 2^(L-1)
  9. c = X mod 2*q
  10. p = X - (c-1)
  11. If p < 2^(L-1)转到第13步。
  12. 测试p是否为素数,若是,请转至步骤15。
  13. counter = counter + 1, offset = offset + n + 1
  14. 如果counter >= 4096转到第1步,如果不转到第7步。
  15. 我们现在有pq,因此qp-1的除数。
  16. 我希望我没有弄错。我完全不了解所有内容,但主要的诀窍是从p计算q而不是尝试相反的事情。

答案 1 :(得分:2)

我个人对此并不了解,但我快速浏览了OpenSSL source代码,并提到了Federal Information Processing Standards Publication 186作为实施所基于的文档。

答案 2 :(得分:2)

q除以p-1与说p ≡ 1 mod q.

相同

FIPS方法实质上移位并添加连续的哈希输出以构建正确大小的伪随机块,然后减去剩余的p ≡ 1 mod 2q,最后测试素数。该过程中唯一的“真实”熵是随机种子。

另请注意,FIPS-186

上面的旧160 bit q是'硬编码'

如果你有足够的熵,你可以很容易地从一个好的来源获得一大块随机,将顶部和底部的位设置为1,减去((p mod q)-1)然后测试它的素数。

答案 3 :(得分:-1)

我不认为这是对的。如果您可以考虑p-1,那么您可以轻松地将公钥计算在内,这非常糟糕。

通常的密钥生成需要两个大的素数p和q,它们的位长相等;他们的乘积n = pq成为密码系统的模数。 n的总数计算为phi(pq)=(p-1)(q-1)。然后选择两个密钥,加密密钥e和解密密钥d,使得de≡1(mod phi(pq))和gcd(e,phi(pq))= 1.E必须是奇数,经常被选择为是最重要的,以强制它是与总和共同素数的条件,并且通常相当小; e = 2 ^ 16 + 1 = 65537是常见的。

我在blog编写了RSA代码,包括密钥生成。