目前我们有一个例程,在给定证书(和它的私钥)的情况下签署一个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库持开放态度。
答案 0 :(得分:0)
您可以通过certificate.PublicKey.Oid检查密钥类型(算法)。 您可以在此处看到Microsoft OID支持:http://msdn.microsoft.com/en-us/library/ff635835.aspx 其他OID可以在oid-info.com上查看