【问题标题】:Encode/Decode in UWP using asymmetric keys使用非对称密钥在 UWP 中编码/解码
【发布时间】:2016-11-21 18:22:07
【问题描述】:

我正在尝试找出一种使用私钥加密字符串并使用公共密钥对其进行解密的方法。我使用 OpenSSL 生成了密钥,如下所述:

http://www.akadia.com/services/ssh_test_certificate.html

这是我目前拥有的

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 corrupted data

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

var privateKey =

@"MIICXwIBAAKBgQDUTqfSknFiQx3aepORHJycWck007cfU4fXluTIyf6U9ipDhyPD …… yDxwZVmexltyK5Bwc26lmb+5EtTEic+kZToYWcCucF8lsok=";

所以OpenSSL生成的密钥文件的内容没有这部分:

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

【问题讨论】:

    标签: c# uwp win-universal-app .net-core windows-10-universal


    【解决方案1】:

    好的,所以我的代码错了,因为我想用私钥加密,但是使用了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 ";
        }
    }
    

    我收到了Method or operation not implemented 异常,要么还是有问题,要么 UWP 中还没有私有加密/公共解密方法。

    我最后做的是获取 nuget 包Portable.BouncyCastle-Signed 并按照此答案中的代码 sn-p:

    C# BouncyCastle - RSA Encryption with Public/Private keys

    像沙姆一样工作。

    【讨论】:

    • 请使用BouncyCastle官方便携版Portable.BouncyCastle。我是便携式叉子的维护者。如果遇到问题,请在 repo 中打开一个问题:github.com/onovotny/bc-csharp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多