最近我对数字签名算法及其工作原理做了一些研究。我的问题对我来说不是实际问题,而是纯粹的兴趣。
但是,我很好奇如何在DSA中生成次级资产:在为算法生成参数期间,选择1024位素数p
。下一步是找到一个160位素数q
,它是p-1
的除数。这就是我被卡住的地方。我不知道如何及时找到次级抵押贷款q
,而不必永远等待。我也无法在互联网上找到有关DSA特定部分的任何文档,我发现的所有示例实现都使用库函数来创建参数。
有没有人更多地了解这次次级抵押贷款的产生,或者可以把我带到一个可以阅读它的地方?
提前致谢。
答案 0 :(得分:3)
根据Zoredache的建议:在Digital Signature Standard中找到为DSA创建素数p
和q
的算法。
允许L-1 = 160*n + b
,其中b,n ∈ ℕ
和0 ≤ b < 160
seed > 2¹⁶⁰
。设g
为seed
的长度。U = sha(seed) XOR sha(seed+1 mod 2^g)
(其中sha是安全散列算法)q = U OR 2¹⁵⁹ OR 1
q
是否为素数,如果不是,请转到第1步。counter = 0, offset = 2
For k = 0,...,n: V_k = sha((seed + offset + k) mod 2^g)
W = V_0 + V_1 * 2^160 + ... + V_(n-1) * 2^((n-1)*160) + (V_n mod 2^b) * 2^(n*160)
X = W + 2^(L-1)
c = X mod 2*q
p = X - (c-1)
If p < 2^(L-1)
转到第13步。p
是否为素数,若是,请转至步骤15。counter = counter + 1, offset = offset + n + 1
counter >= 4096
转到第1步,如果不转到第7步。p
和q
,因此q
是p-1
的除数。我希望我没有弄错。我完全不了解所有内容,但主要的诀窍是从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代码,包括密钥生成。