在.NET或BouncyCastle中确定证书密钥类型(RSA vs EC)?

时间:2013-02-03 21:51:28

标签: rsa bouncycastle elliptic-curve

目前我们有一个例程,在给定证书(和它的私钥)的情况下签署一个byte []。但是,证书/密钥的类型被硬编码为“带RSA密钥的证书”。该代码是:

public byte[] Sign(byte[] bytesToSign, bool fOAEP, X509Certificate2 certificate)
{
    using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
    {
        // HACK: Round-trip the key to XML and back, to get provider type working
        // as 'Microsoft Enhanced RSA and AES Cryptographic Provider' (for  
        // SHA256/SHA512 signing hash) instead of 'Microsoft Enhanced 
        // Cryptographic Provider v1.0' (that limits us to SHA1)
        string publicKeyXml = certificate.PrivateKey.ToXmlString(true);
        provider.FromXmlString(publicKeyXml);

        // We use the private key to sign.
        return provider.SignData(bytesToSign, CryptoConfig.MapNameToOID("SHA512"));
    }
}

我们希望使其更灵活,如果证书使用RSA密钥,我们以一种方式处理它,但如果它使用EC密钥,那么我们以不同的方式处理它。基本上,加密服务提供者类型将是不同类型。

所以核心问题是:

  • 鉴于带有公钥+私钥(用于签名)的证书或仅包含公钥的证书(用于验证),您如何确定证书使用的密钥类型?

我对标准.NET库或甚至BouncyCastle.Org库持开放态度。

1 个答案:

答案 0 :(得分:0)

您可以通过certificate.PublicKey.Oid检查密钥类型(算法)。 您可以在此处看到Microsoft OID支持:http://msdn.microsoft.com/en-us/library/ff635835.aspx 其他OID可以在oid-info.com上查看