[英]Encrypt data with X509 certificate's private key in UWP
我正在向用戶顯示其個人商店中的所有可用證書,並通過以下方法獲取:
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密鑰,Byte []輸入,AsymmetricPaddingMode paddingMode,Void * paddingInfo,EncryptOrDecryptAction cryptoOrDecrypt)
在System.Security.Cryptography.RSACng.EncryptOrDecrypt(Byte []數據,RSAEncryptionPadding填充,EncryptOrDecryptAction加密或解密)
在System.Security.Cryptography.RSACng.Encrypt(Byte [] data,RSAEncryptionPadding padding)
以我的方式
Internal.Cryptography.CryptoThrowHelper + WindowsCryptographicException:
請求的操作不受支持
在Security.Cryptography.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle密鑰,Byte []輸入,AsymmetricPaddingMode paddingMode,Void * paddingInfo,EncryptOrDecryptAction cryptoOrDecrypt)
在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應用程序中工作時,我只能訪問一些System.Security名稱空間 。
我找到了解決問題的方法,這是由於以下兩個錯誤:
首先,這里使用的加密方法不是Encrypt而是SignData ,因為我想對數據進行電子簽名。
其次,為了進行有效簽名,證書需要包含“ 不可否認”擴展名。 為了確認這一點,我添加了以下方法:
private bool _canUsingCertificateForSignData(X509ExtensionCollection extensions)
{
if (extensions != null)
{
foreach (var ext in extensions)
{
if (ext.GetType().Equals(typeof(X509KeyUsageExtension)))
{
if (((X509KeyUsageExtension)ext).KeyUsages.HasFlag(X509KeyUsageFlags.NonRepudiation))
{
return true;
}
}
}
}
return false;
}
我現在使用以下方法獲取證書:
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 && _canUsingCertificateForSignData(certificate.Extensions))
{
certificates.Add(certificate);
}
}
}
return certificates;
}
我仍然不明白的一件事是,當從pfx文件而不是從存儲中獲取證書時,為什么SignData方法不會引發任何異常並對數據進行簽名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.