c# - 使用 Azure Key Vault RSA key 加密和解密字符串

标签 c# .net azure encryption rsa

我已设置 Azure Key Vault 来检索 RSA key 以进行加密。 Azure 向我发送一个 KeyBundle 类型的对象。该对象包含一个 RSA 大小为 2048 类型的 JsonWebKey。查看我的 RSA key ,它有 2 个方法,分别为 Encrypt(byte[] data, RSAEncryptionPadding padding)Decrypt(byte[] data, RSAEncryptionPadding padding)。现在我正在尝试加密和解密一个简单的字符串,如下所示:

public EncryptionManager(KeyBundle encryptionKey)
{
    string test = "Hello World!";
    var key = encryptionKey.Key.ToRSA();
    var encryptedString = key.Encrypt(Encoding.UTF8.GetBytes(test), RSAEncryptionPadding.OaepSHA256);
    var decryptedString = key.Decrypt(encryptedString, RSAEncryptionPadding.OaepSHA256);
}

加密有效,但解密会引发异常并显示消息:

Key does not exist.

这是堆栈跟踪

at System.Security.Cryptography.RSAImplementation.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle key, ReadOnlySpan`1 input, AsymmetricPaddingMode paddingMode, Void* paddingInfo, Boolean encrypt) at System.Security.Cryptography.RSAImplementation.RSACng.EncryptOrDecrypt(Byte[] data, RSAEncryptionPadding padding, Boolean encrypt) at System.Security.Cryptography.RSAImplementation.RSACng.Decrypt(Byte[] data, RSAEncryptionPadding padding) at NxtUtils.Security.EncryptionManager..ctor(KeyBundle encryptionKey) in C:\Repos\Enigma\EnigmaPrototype\SharedLibaries\NxtUtils\Security\EncryptionManager.cs:line 26

我对密码算法实在是不太熟悉。我的问题是:如何使用 Azure 提供的 RSA key 加密和解密简单的 strig?

谢谢!

最佳答案

我遇到了同样的问题,尽管我从互联网上搜索并从 Microsoft 文档中获取了此内容,但我所做的是在这里

所以这是我下面的工作代码

public static class KeyVaultEncryptorDecryptor
{
    public static string KeyDecryptText(this string textToDecrypt , KeyVaultClient keyVaultClient, string keyidentifier)
    {
        var kv = keyVaultClient;
        try
        {
            var key = kv.GetKeyAsync(keyidentifier).Result;
            var publicKey = Convert.ToBase64String(key.Key.N);
            using var rsa = new RSACryptoServiceProvider();
            var p = new RSAParameters() {
                Modulus = key.Key.N, Exponent = key.Key.E
            };
            rsa.ImportParameters(p);
            var encryptedTextNew = Convert.FromBase64String(textToDecrypt);
            var decryptedData = kv.DecryptAsync(key.KeyIdentifier.Identifier.ToString(), JsonWebKeyEncryptionAlgorithm.RSAOAEP, encryptedTextNew).GetAwaiter().GetResult();
            var decryptedText = Encoding.Unicode.GetString(decryptedData.Result);
            return decryptedText;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return default;
        }
    }

    public static string KeyEncryptText(this string textToEncrypt , KeyVaultClient keyVaultClient, string keyidentifier)
    {
        var kv = keyVaultClient;
        try
        {
            var key = kv.GetKeyAsync(keyidentifier).GetAwaiter().GetResult();
            var publicKey = Convert.ToBase64String(key.Key.N);
            using var rsa = new RSACryptoServiceProvider();
            var p = new RSAParameters() {
                Modulus = key.Key.N, Exponent = key.Key.E
            };
            rsa.ImportParameters(p);
            var byteData = Encoding.Unicode.GetBytes(textToEncrypt);
            var encryptedText = rsa.Encrypt(byteData, true);
            string encText = Convert.ToBase64String(encryptedText);
            return encText;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return default;
        }
    }

}

关于c# - 使用 Azure Key Vault RSA key 加密和解密字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51103490/

相关文章:

c# 在对象不是 null 时将其报告为 null

c# - Roslyn 中的简单代码完成示例

.net - 该路径可能与 WebDAV 中的文件名无关

.net - 监视 Azure WebJob 的 CPU 和内存

sql-server - Azure SQL 数据库最快的备份/恢复策略?

让我冲洗的 C# 线程模式

.net - 如何确定我的 .NET 程序使用了多少内存?

c# - 使用 XPath 测试当前节点

c# - 我的 AAD 身份验证回复网址有什么问题吗?

c# - 我在哪里可以找到 Visual Studio 2017 中的 trackbar winforms 控件?