Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用X509证书加密数据';UWP中的s私钥_C#_Encryption_Uwp_X509certificate2 - Fatal编程技术网

C# 使用X509证书加密数据';UWP中的s私钥

C# 使用X509证书加密数据';UWP中的s私钥,c#,encryption,uwp,x509certificate2,C#,Encryption,Uwp,X509certificate2,我将向用户显示其个人存储中的所有可用证书,使用以下方法获取: public List<X509Certificate2> GetPersonalCertificates() { var certificates = new List<X509Certificate2>(); using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { sto

我将向用户显示其个人存储中的所有可用证书,使用以下方法获取:

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;
}
该方法应该使用SHA256算法使用RSA私钥加密数据,但它一直落入catch语句中

我得到的错误取决于我使用的证书:

  • 当我使用在用户个人存储中注册的证书时:
内部.Cryptography.CryptothWherPer+WindowsCryptography异常:

无效参数

在System.Security.Cryptography.RSACng.EncryptOrDecrypt(SafeCryptKeyHandle 键,字节[]输入,不对称填充模式填充模式,无效* 填充信息,encryptOrDecrypt操作encryptOrDecrypt)

在System.Security.Cryptography.RSACng.EncryptOrDecrypt(字节[]数据, RSAEncryptionPadding,EncryptOrDecryptAction encryptOrDecrypt)

在System.Security.Cryptography.RSACng.Encrypt(字节[]数据, RSAEncryptionPadding(加密填充)

按我的方法

  • 当我使用USB密钥的证书时:
内部.Cryptography.CryptothWherPer+WindowsCryptography异常:

不支持请求的操作

在Security.Cryptography.RSACng.EncryptOrDecrypt(SafeCryptKeyHandle 键,字节[]输入,不对称填充模式填充模式,无效* 填充信息,encryptOrDecrypt操作encryptOrDecrypt)

在System.Security.Cryptography.RSACng.EncryptOrDecrypt(字节[]数据,rsacencryptionpadding,EncryptOrDecryptAction 加密机(加密)

位于System.Security.Cryptography.RSACng.Encrypt(字节[]数据,RSAEncryptionPadding)

按我的方法

我还尝试了私钥的SignData方法,导致了相同的异常:

encryptedFile = privateKey.SignData(hashToSign, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
我错过什么了吗


请注意,由于我在使用UWP应用程序,我只能访问。

我找到了解决问题的方法,这是由于以下两个错误:

首先,这里使用的加密方法不是加密,而是签名数据,因为我想对数据进行电子签名

其次,为了生成有效的签名,证书需要包含不可抵赖性扩展。为了验证这一点,我添加了以下方法:

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;
}
公共列表GetPersonalCertificates() { var证书=新列表(); 使用(var store=new X509Store(StoreName.My,StoreLocation.CurrentUser)) { store.Open(OpenFlags.MaxAllowed); foreach(存储区中的var证书。证书) { if(certificate!=null&&certificate.HasPrivateKey&&u可以使用CertificateForSignData(certificate.Extensions)) { 证书。添加(证书); } } } 退货证明书; }
我仍然不明白的一件事是,SignData方法在从pfx文件而不是从存储中获取证书时,为什么不引发任何异常并对数据进行签名。

您是否尝试过使用OaepSha1而不是OaepSha256?试图缩小问题的范围。不幸的是,我在OaepSha1和Pkcs1上得到了相同的结果。@ThomasFerro您应该使用公钥加密某些内容,使用私钥解密。@pepi我在这里对数据进行数字签名,所以重点不是使这些数据无法读取。相反,我们的目标是能够证明给定用户通过使用其公钥解密数据来签署文档。存储中的密钥可能应用了某些权限/限制,这些权限/限制要么没有导出到PFX,要么PFX是在以这种方式设置权限之前应用的。
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;
}