比私钥更大的DSA公钥

时间:2015-10-28 17:16:26

标签: c++ public-key-encryption crypto++ dsa

如果我使用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,并且公钥比私钥小得多。

1 个答案:

答案 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位 - 这是私钥长度。

这看起来合理吗?