Encode/Decode 在 UWP 中使用非对称密钥

Encode/Decode in UWP using asymmetric keys

我正在尝试找出一种使用私钥加密字符串并使用 public 私钥解密的方法。我按照以下所述使用 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-----

好的,所以我的代码是错误的,因为我想用私钥加密,但是使用了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 密钥解密时,使用以下类似方法;

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 中还没有 private-encrypt/public-decrypt 方法。

我最后做的是获取 nuget 包 Portable.BouncyCastle-Signed 并遵循此答案中的代码片段:

效果很好。