我有一项使用私钥进行加密的服务。当我授予服务管理权限时,它可以工作。使用普通权限,它不会。调用 GetRSAPrivateKey() 时出现错误“指定的提供程序类型无效”。
var data = Convert.FromBase64String(cipherText);
var dataList = data.ToList();
using (var store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine))
using (var aesProvider = new AesCryptoServiceProvider())
{
store.Open(OpenFlags.ReadOnly);
byte[] key;
using (var cert = store.Certificates.Find(X509FindType.FindBySubjectName, CertificateName, false)[0])
{
var publicKey = cert.GetRSAPublicKey();
var encryptLength = publicKey.Encrypt(Encoding.UTF8.GetBytes("xxxxxxx"), RSAEncryptionPadding.OaepSHA512).Length;
var encryptedKey = dataList.Take(encryptLength).ToArray();
dataList.RemoveRange(0, encryptLength);
var privateKey = cert.GetRSAPrivateKey();
key = privateKey.Decrypt(encryptedKey, RSAEncryptionPadding.OaepSHA512);
}
如果密钥不存在,则会在安装过程中以编程方式将其添加到存储中。
var rsa = RSA.Create(2048);
var request = new CertificateRequest($"cn={CertificateName}", rsa, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
var cert = request.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(50));
File.WriteAllBytes("c:\\temp\\EncryptionCert.pfx", cert.Export(X509ContentType.Pfx, _certificatePassword));
store.Open(OpenFlags.ReadWrite);
using (var cert = new X509Certificate2("c:\\temp\\EncryptionCert.pfx", _certificatePassword,
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet))
{
store.Add(cert);
}
是否有允许访问证书存储的非管理员帐户设置,或者我在加载代码时做错了什么?