如果我使用Crypto ++生成DSA的私钥和公钥:
CryptoPP::AutoSeededRandomPool rng;
CryptoPP::DSA::PrivateKey privateKey;
privateKey.GenerateRandomWithKeySize(rng, 2048);
CryptoPP::DSA::PublicKey publicKey;
privateKey.MakePublicKey(publicKey);
当我像这样对私钥进行编码时:
CryptoPP::ByteQueue privateKeyQueue;
key.DEREncodePrivateKey(privateKeyQueue);
然后,推送到私钥的队列的信息小于公钥的编码数据:
CryptoPP::ByteQueue publicKeyQueue;
key.DEREncodePublicKey(publicKeyQueue);
这是预期的,这是生成将与他人共享的公钥的正确方法吗?
我之前只使用过RSA,并且公钥比私钥小得多。
答案 0 :(得分:1)
所以......轻轻踩踏因为模运算不是我的强点......
我的信息来源是:
https://en.wikipedia.org/wiki/Digital_Signature_Algorithm
选择一个经批准的加密哈希函数H.在原始DSS中,H始终是SHA-1,但更强的SHA-2哈希函数被批准用于当前的DSS。[5] [9]散列输出可以截断为密钥对的大小。
确定密钥长度L和N.这是密钥加密强度的主要衡量标准。原始DSS将L约束为512到1024(包括)之间的64的倍数。 NIST 800-57建议密钥的长度为2048(或3072),安全寿命延长到2010年(或2030年)以后,使用相应更长的N. [10] FIPS 186-3指定L和N长度对(1024,160),(2048,224),(2048,256)和(3072,256)。
选择N位素数q。 N必须小于或等于散列输出长度。
(所以q是N位长 - 对于3072位密钥说256)
选择L位素数模p,使得p-1是q的倍数。 选择g,其乘法阶数p为q的乘数。这可以通过将g = h(p-1)/ q mod p设置为某个任意h(1
(所以p将是3072位长)
算法参数(p,q,g)可以在系统的不同用户之间共享。
每用户密钥
给定一组参数,第二阶段为单个用户计算私钥和公钥:
通过一些随机方法选择x,其中0 <0。 x&lt; Q值。 计算y = gx mod p。
公钥是(p,q,g,y)。
公钥中有一个p - 所以它必须至少有3072位长
私钥是x。
由于x取决于q,它将具有(在我们的例子中)256位 - 这是私钥长度。
这看起来合理吗?