DSA公钥大于私钥

DSA public key bigger than private key

本文关键字:私钥 大于 公钥 DSA      更新时间:2023-10-16

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

所以。。。轻描淡写,因为模运算不是我的强项。。。

我的信息来源在这里:

https://en.wikipedia.org/wiki/Digital_Signature_Algorithm

选择一个已批准的加密哈希函数H。在原始DSS中,H始终是SHA-1,但更强的SHA-2哈希函数已批准在当前DSS中使用。[5] [9]散列输出可以被截断为密钥对的大小。

决定密钥长度L和N。这是衡量密钥加密强度的主要指标。原始DSS将L约束为512和1024(包括512和1024)之间的64的倍数。NIST 800-57建议安全寿命超过2010年(或2030年)的密钥长度为2048(或3072),使用相应更长的N。[10]FIPS 186-3规定了(1024160)、(2048224)、(204 8256)和(3072256)的L和N长度对。

选择一个N位素数q。N必须小于或等于哈希输出长度。

(所以q是N比特长,比如说对于3072比特密钥是256)

选择一个L位素数模p,使得p–1是q的倍数。选择g,一个乘法阶模p为q的数字。这可以通过对任意h(1<h<p−1)设置g=h(p–1)/q mod p来完成,如果结果为1,则用不同的h重试。h的大多数选择将导致可用的g;通常使用h=2。

(因此p为3072位长)

算法参数(p,q,g)可以在系统的不同用户之间共享。

每个用户密钥

给定一组参数,第二阶段计算单个用户的私钥和公钥:

通过某种随机方法选择x,其中0<x<q计算y=gx mod p.

公钥是(p,q,g,y)。

公钥中有一个p,所以它必须是至少3072位长的

私钥是x.

由于x取决于q,所以(在我们的情况下)它将有256位——这是私钥长度。

这看起来合理吗?