Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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# 使用非对称密钥的UWP编码/解码_C#_Uwp_Win Universal App_.net Core_Windows 10 Universal - Fatal编程技术网

C# 使用非对称密钥的UWP编码/解码

C# 使用非对称密钥的UWP编码/解码,c#,uwp,win-universal-app,.net-core,windows-10-universal,C#,Uwp,Win Universal App,.net Core,Windows 10 Universal,我试图找到一种方法,用私钥加密字符串,用公钥解密。我使用OpenSSL生成密钥,如中所述: 这就是我目前拥有的 public static string Encrypt(string str, string key) { try { key = key.Replace(Environment.NewLine, ""); IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(k

我试图找到一种方法,用私钥加密字符串,用公钥解密。我使用OpenSSL生成密钥,如中所述:

这就是我目前拥有的

public static string Encrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

        CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null);

        return CryptographicBuffer.EncodeToBase64String(encryptedData);
    }
    catch (Exception e)
    {
        throw;
        return "Error in Encryption:With RSA ";
    }
}
然而,在ImportPublicKey方法中,我得到了一个异常
ASN1损坏数据

传递给该方法的字符串
具有以下格式:

var privateKey =
@“MIICXWIBAAKBGQDUTQFSNFIQX3AEPORHJYCWK007CFU4FXLUTIYF6U9IPDHYPD .... yDxwZVmexltyK5Bwc26lmb+5EtTEic+kZToYWcCucF8lsok=“

因此,OpenSSL生成的密钥文件的内容不包含此部分:

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

好的,所以我的代码是非常错误的,因为我想用私钥加密,但是使用了
ImportPublicKey
函数,正确的方法应该是

public static string Encrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

        var keyPar = provider.ImportKeyPair(keyBuffer, CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey);
        //CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Encrypt(keyPar, dataBuffer, null);
        var encryptedStr = CryptographicBuffer.EncodeToBase64String(encryptedData);
        var signature = CryptographicEngine.Sign(keyPar, dataBuffer);
        var signatureStr = CryptographicBuffer.EncodeToBase64String(signature);
        return encryptedStr;
    }
    catch (Exception e)
    {
        throw;
        return "Error in Encryption:With RSA ";
    }
}
这可以使用RSA私钥对字符串进行加密

但是,当我尝试使用公钥解密时,使用以下类似的方法

public static string Decrypt(string str, string key)
{
    try
    {
        key = key.Replace(Environment.NewLine, "");
        IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);

        AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha256);

        CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
        IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
        var encryptedData = CryptographicEngine.Decrypt(publicKey, dataBuffer, null);
        return CryptographicBuffer.EncodeToBase64String(encryptedData);
    }
    catch (Exception e)
    {
        throw;
        return "Error in Decryption:With RSA ";
    }
}
我得到了一个未实现的
方法或操作
异常,要么仍然有问题,要么UWP中还没有私有加密/公共解密方法

我最后做的是让nuget软件包
可移植。BouncyCastle签名
,并按照下面的答案中的代码片段进行操作:


像沙姆一样工作。

请使用官方便携式版本的BouncyCastle,portable.BouncyCastle。我是便携式叉子的维护者。如果遇到问题,请在repo中打开问题:github.com/onovotny/bc-csharp