如何从 Bouncycastle 中的 PEM 文件加载 DSA 参数?

How do I load DSA Parameters from a PEM file in Bouncycastle?

我有一个 DSA 参数的 PEM 文件。换句话说,内容有 header/footer 这样的:

-----BEGIN DSA PARAMETERS----- ....... -----END DSA PARAMETERS-----

我看到 bouncycastle 有 类 用于 DSAParametersDSAKeyGenerationParmaters。我怀疑这个 PEM 是这些参数的表示,但我不知道如何从 PEM 格式加载它。

(背景:从遗留项目中,我预计 DSA 的签名为 40 字节,但我得到的是 46 字节。我怀疑 DSA 参数是罪魁祸首,我有这个旧 dsa1024.pem 如前所述,我正在尝试加载并用于生成 keys/generate 签名...)

至少到 1.57(我还没有安装 1.58)BCpkix org.bouncycastle.openssl.PEMParser 没有实现 DSA 参数(尽管它确实实现了 EC 参数)所以这并不容易。 只需查看您的参数,使用起来就会(容易得多)

 openssl dsaparam -in file -noout -text 

但我保证您不会发现您的参数有任何问题。经典的 DSA 参数是 1024 位组和 160 位子组,20 年来没有任何变化或变化,我从未见过任何实现出错。

DSA-1024/160 签名占用超过 40 个八位字节的通常原因是因为按照惯例(尽管 FIPS 186 不要求)它是用 ASN.1 DER 编码的。如果您曾就此提出问题,我可以向您指出 ECDSA 的现有问题,它具有完全相同的问题:

https://crypto.stackexchange.com/questions/1795/how-can-i-convert-a-der-ecdsa-signature-to-ASN.1 https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103
https://crypto.stackexchange.com/questions/37528/why-do-openssl-elliptic-curve-digital-signatures-differ-by-one-byte
https://crypto.stackexchange.com/questions/44988/length-of-ecdsa-signature

但是由于您提出的问题与您的实际问题无关,所以为您提供实际问题的解决方案是违反 Stack 政策的。

FWIW 如果您使用参数在 OpenSSL 中生成 DSA key(pair),私钥的所有 4 种 PEM 格式(pkcs8 明文和加密,'legacy' 明文和encrypted) 和公钥 (SPKI) 可读的常用 PEM 格式 PEMParser 并且可以生成可以从中提取参数的密钥对象。 (从技术上讲,SPKI 规范允许在某些情况下省略 DSA 参数,但 OpenSSL 永远不会这样做。)