DSA公钥大于私钥
DSA public key bigger than private key
如果我使用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位——这是私钥长度。
这看起来合理吗?
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何在C++中使用X509证书模在令牌中查找私钥
- 私钥解密代码使用公共接口说明符到 BSAFE 库 v6.0?
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- 将私钥和证书存储在C++/OpenSSL中
- 区块链超级账本私钥错误
- 博坦加载现有的 RSA 私钥
- C 从XML导入CAPI/CNG中的RSA私钥
- 使用密码将 RSA 私钥写入 PEM 文件
- 一代 RSA-2048 密钥(公钥和私钥)
- 如何获取PCCERT_CONTEXT私钥的NCRYPT_KEY_HANDLE?
- 将ECDSA Keypair的公共和私钥分开
- RSA 私钥加密 QT C++
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 openssl libcrypto 解密具有 RSA 私钥的数据时RSA_NO_PADDING的使用
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- OpenSSL AES_CFB128_ENCRYPT公共/私钥C
- 如何通过PKCS#11 API从电子令牌获取私钥
- 使用 OpenSSL 生成私钥
- DSA公钥大于私钥