1

目前我们有一个例程,它在给定证书(并且它是私钥)的情况下对字节 [] 进行签名。但是,证书/密钥的类型被硬编码为“带有 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 库持开放态度。

4

1 回答 1

0

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

于 2013-02-04T08:51:45.443 回答