使用PEM文件创建DSA签名



TL;DR…如何使用.Net Framework 4.5.2 使用PEM私钥文件创建DSA签名

我提前道歉。。。这对我来说是全新的,因为我从来没有处理过这样的加密。所以请温柔一点!

详细信息

我正在使用.Net Framework 4.5.2处理一个旧的ASP.Net项目…是的,我很清楚它已经过时了,但现在我无能为力

我需要将数据发送到API,其中该数据的一部分(由其他已知数据组成的"签名"(使用DSA通过客户端提供的私钥加密是的,我非常清楚现在应该使用RSA,但这正是客户的要求

私钥已在PEM格式文件中提供(即文件以-----BEGIN DSA PRIVATE KEY-----开头(

我从codeproject.com上发现了AsnKeyParser类,但到目前为止,我还没有弄清楚如何将该类与PEM格式文件一起使用。

这个(故意(令人困惑的答案凸显了我的困惑和缺乏理解。

有人能告诉我如何做到这一点吗?因为我浪费了一整天的时间进行调查,但没有取得任何真正的成功?

在将Base64解码的证书(在标头之间(传递给AsnKeyParser类之前,我是否需要将其从DER转换为ASN.1?如果是,如何?

(如果有必要,我可以考虑使用更新的.Net版本创建一个外部服务,我可以从4.5.2代码中调用它……但我更希望它被封装到一个单独的项目中。(


编辑

根据@Topaco的要求,这里是客户提供的一个示例密钥对,客户告诉我according to Google: DSA Key Size: 2048 bits。。。

-----BEGIN DSA PRIVATE KEY-----
MIIBugIBAAKBgQDzGuacD99b5uI/yv8k9B0ayApGge79XN18K3NDals1M/ae31Aa
REiT3pM2Vy+rwZqMXkAjdvBRbAAIWULCPmwlJ25IHBg9zZmK0NymS3qaKd5g3LFC
QXRmOLEVhv0TkZAFmi3u71nvDY35hD5S1OlxXp317MIz8U6/usJhtHjQywIVAKAF
qSaXNbaXLei/kNvHeEMxJvPzAoGAcq8gQ4T1o+xkj7ilhEv1XxiAjKJAZao15JOc
G6D9itSkDTZk/4WftDdIwWV8cYCG6PHmbvGi4i/2Z/LIixnuqWJTUG/EpiXf2RAV
47wgUjGmKtIbpUURSGE+XFfYf5R63hmLp2Jn40NqU9OlAScCDEAqN62YB6+Kua71
/ngDzNACgYBUgc3Gw85Amc2BpFruGsUkB4spnonmueq5HV3bcYIxvrO03UTQovTi
8yvQRUPYSIfCzgS2800ntwizZ6NCwUj6lda6YVBZWw8rg7D9HYoD9aOz4GtN57Da
qml0C3Tqh/1wZI5K+lmyDJfex/nQ4iGQoCmzKftWf13x1iCKM08ULwIUZ8Ig9WT9
Q3BcHfdOKLqa3nbYXCw=
-----END DSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBtjCCASsGByqGSM44BAEwggEeAoGBAPMa5pwP31vm4j/K/yT0HRrICkaB7v1c
3Xwrc0NqWzUz9p7fUBpESJPekzZXL6vBmoxeQCN28FFsAAhZQsI+bCUnbkgcGD3N
mYrQ3KZLepop3mDcsUJBdGY4sRWG/RORkAWaLe7vWe8NjfmEPlLU6XFenfXswjPx
Tr+6wmG0eNDLAhUAoAWpJpc1tpct6L+Q28d4QzEm8/MCgYByryBDhPWj7GSPuKWE
S/VfGICMokBlqjXkk5wboP2K1KQNNmT/hZ+0N0jBZXxxgIbo8eZu8aLiL/Zn8siL
Ge6pYlNQb8SmJd/ZEBXjvCBSMaYq0hulRRFIYT5cV9h/lHreGYunYmfjQ2pT06UB
JwIMQCo3rZgHr4q5rvX+eAPM0AOBhAACgYBUgc3Gw85Amc2BpFruGsUkB4spnonm
ueq5HV3bcYIxvrO03UTQovTi8yvQRUPYSIfCzgS2800ntwizZ6NCwUj6lda6YVBZ
Ww8rg7D9HYoD9aOz4GtN57Daqml0C3Tqh/1wZI5K+lmyDJfex/nQ4iGQoCmzKftW
f13x1iCKM08ULw==
-----END PUBLIC KEY-----

对于DSA,.NET Framework 4.5.2在密钥大小(最多1024位,请参阅此处(和摘要(仅SHA1,请参阅这里(方面非常有限。

因此,从一开始就使用功能更强大的第三方提供商(如BouncyCastle(更有意义。BouncyCastle还提供PemReader,用于方便地导入PEM编码的密钥。

导入:

using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto;
...
string privDsaPem = @"-----BEGIN DSA PRIVATE KEY-----
MII...
-----END DSA PRIVATE KEY-----";
PemReader pemReader = new PemReader(new StringReader(privDsaPem));
AsymmetricCipherKeyPair dsaKeyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
AsymmetricKeyParameter dsaPrivParams = dsaKeyPair.Private;

签署:

using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto;
using System;
...
ISigner sig = SignerUtilities.GetSigner("SHA256withDSA");
sig.Init(true, dsaPrivParams);
sig.BlockUpdate(message, 0, message.Length);
byte[] signatureBC = sig.GenerateSignature();           // ASN.1/DER format
Console.WriteLine(Convert.ToBase64String(signatureBC)); // e.g. MEYCIQDDznPDx5YjsszeOvNbvX2pgTDP4qtkOXMlNo+9B9+xsAIhAKOf8G16Z7uFLlevnC1DzUE+Op5XmwoxbK6my/RjEIRG

适用于张贴的解决方案:

  • DSA签名以ASN.1/DER编码格式返回(因此可以加载到ASN.1解析器中,例如。https://lapo.it/asn1js/)
  • 作为摘要,应用了SHA256

关于签名格式和摘要,请考虑以下内容:

DSA签名由两部分组成,rs,请参阅此处。DSA签名有不同的格式。在上述解决方案中,签名的rs值以ASN.1/DER编码格式提供。另一种格式是IEEE P.1363,其中rs是串联的。请参阅此处了解两种格式的关系以及它们之间的转换。

除了SHA256之外,BouncyCastle还支持DSA的其他摘要,有关更多摘要和标识符,请参阅SignerUtilities。cs

双方必须采用相同的摘要才能成功验证,为了避免不必要的转换,如果可能,应使用相同的签名格式。

最新更新