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