【发布时间】:2017-11-18 02:31:45
【问题描述】:
我正在向用户显示他个人商店中的所有可用证书,使用以下方法获取:
public List<X509Certificate2> GetPersonalCertificates()
{
var certificates = new List<X509Certificate2>();
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.MaxAllowed);
foreach (var certificate in store.Certificates)
{
if (certificate != null && certificate.HasPrivateKey)
{
certificates.Add(certificate);
}
}
}
return certificates;
}
当用户选择其中一个证书时,会加载一个示例文件并将其提供给以下方法:
public byte[] EncryptFile(X509Certificate2 certificate, byte[] fileToEncrypt)
{
if (certificate == null || hashToSign == null) return null;
byte[] encryptedFile = null;
try
{
using (var privateKey = certificate.GetRSAPrivateKey())
{
encryptedFile = privateKey.Encrypt(hashToSign, System.Security.Cryptography.RSAEncryptionPadding.OaepSHA256);
}
}
catch (Exception e)
{
// Error management
}
return encryptedFile;
}
该方法本应使用 SHA256 算法使用 RSA 私钥对数据进行加密,但一直落入 catch 语句中。
我得到的错误取决于我使用的证书:
- 当我使用在用户个人商店注册的证书时:
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException:
参数无效
在 System.Security.Cryptography.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle key, Byte[] 输入, AsymmetricPaddingMode paddingMode, Void* paddingInfo, EncryptOrDecryptAction encryptOrDecrypt)
在 System.Security.Cryptography.RSACng.EncryptOrDecrypt(Byte[] 数据, RSAEncryptionPadding 填充,EncryptOrDecryptAction encryptOrDecrypt)
在 System.Security.Cryptography.RSACng.Encrypt(Byte[] 数据, RSAEncryptionPadding 填充)
在我的方法
- 当我使用 USB 密钥中的证书时:
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException:
不支持请求的操作
在 Security.Cryptography.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle key, Byte[] 输入, AsymmetricPaddingMode paddingMode, Void* paddingInfo, EncryptOrDecryptAction encryptOrDecrypt)
在 System.Security.Cryptography.RSACng.EncryptOrDecrypt(Byte[] 数据,RSAEncryptionPadding 填充,EncryptOrDecryptAction 加密或解密)
在 System.Security.Cryptography.RSACng.Encrypt(Byte[] data, RSAEncryptionPadding padding)
在我的方法
我也尝试过私钥的 SignData 方法,导致同样的异常:
encryptedFile = privateKey.SignData(hashToSign, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
我错过了什么吗?
请注意,由于我正在使用 UWP 应用程序,因此我只能访问 some of the System.Security namespace。
【问题讨论】:
-
您是否尝试过使用 OaepSha1 而不是 OaepSha256?试图缩小问题的可能范围。
-
不幸的是,我使用 OaepSha1 和 Pkcs1 得到了相同的结果。
-
@ThomasFerro 您应该使用 PublicKey 加密某些东西,并使用 PrivateKey 解密。
-
@pepi 我要在这里对数据进行数字签名,所以重点不是让这些数据不可读。相反,目标是能够证明给定用户使用他的公钥解密数据来签署文档。
标签: c# encryption uwp x509certificate2