gpt4 book ai didi

c# - 如何使用 Compact Framework 在 C# 中验证 X.509 证书

转载 作者:太空狗 更新时间:2023-10-29 20:32:14 24 4
gpt4 key购买 nike

我正在尝试使用 C# 和 .NetCF 验证 X.509 证书。我有 CA 证书,如果我理解正确的话,我需要使用这个 CA 证书中的公钥来解密不受信任证书的签名。这应该给我不受信任证书的计算哈希值。然后我应该自己计算证书的哈希值并确保两个值匹配。

我已经用这个玩了几天了,但进展并不顺利。我一直在使用 X509Certificate 和 RSACryptoServiceProvider 类。首先,我尝试从 X509Certificate 类中获取公钥和签名。我能够获得公钥但不能获得签名。接下来,我尝试解析构成证书的二进制数据,这使我能够获得签名(以及我想要的任何其他数据),但我无法使用 RSACryptoServiceProvider 解密签名。我尝试过这样的事情,但在我尝试解密时不断收到异常提示“Bad Key”:

RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);

如有任何建议,我们将不胜感激。

编辑:我尝试了一些似乎更好但返回奇怪结果的方法。我在这里使用 X509Certificate2 类,因为它更容易测试,但稍后我需要切换到 X509Certificate for .NetCF。我认为 RSACryptoServiceProvider.VerifyData 可能是我需要的。我尝试了以下代码。

X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");

byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);

正如我所说,我能够手动解码和解释证书的二进制数据,所以我很确定 cert.RawData 是证书的签名数据,最后 256 个字节是加密签名。该字符串是哈希算法的 OID,我从证书中得到的,但我不能 100% 确定它是正确的。 VerifyData 返回 false,但我还不确定原因。

想法?

最佳答案

这是我的代码。

RSACryptoServiceProvider rsa = signingCertificate_GetPublicKey();
return rsa.VerifyData( SignedValue(), CryptoConfig.MapNameToOID( "SHA1" ), Signature() );

RSACryptoServiceProvider signingCertificate_GetPublicKey()
{
RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();

RSAParameters publicKeyParams = new RSAParameters();
publicKeyParams.Modulus = GetPublicKeyModulus();
publicKeyParams.Exponent = GetPublicKeyExponent();

publicKey.ImportParameters( publicKeyParams );

return publicKey;
}

byte[] GetPublicKeyExponent()
{
// The value of the second TLV in your Public Key
}

byte[] GetPublicKeyModulus()
{
// The value of the first TLV in your Public Key
}

byte[] SignedValue()
{
// The first TLV in your Ceritificate
}

byte[] Signature()
{
// The value of the third TLV in your Certificate
}

我希望能对正在解决这个问题的任何人有所帮助。

关于c# - 如何使用 Compact Framework 在 C# 中验证 X.509 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3630478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com