簡體   English   中英

在UWP中使用X509證書的私鑰加密數據

[英]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)

我的方式

  • 當我使用USB密鑰中的證書時:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM