使用 Azure Key Vault RSA 密钥加密和解密字符串

问题描述 投票:0回答:3

我已设置 Azure Key Vault 来检索 RSA 密钥进行加密。 Azure 向我发送一个 KeyBundle 类型的对象。该对象包含一个类型为 RSA,大小为 2048 的 JsonWebKey。看看我的 RSA 密钥,它有 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);
}

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

密钥不存在。

这是堆栈跟踪

在 System.Security.Cryptography.RSAImplementation.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle 键,ReadOnlySpan`1 输入,AsymmetryPaddingMode paddingMode,Void* paddingInfo,布尔加密)位于 System.Security.Cryptography.RSAImplementation.RSACng.EncryptOrDecrypt(字节[] 数据、RSAEncryptionPadding 填充、布尔加密) System.Security.Cryptography.RSAImplementation.RSACng.Decrypt(字节[] 数据、RSAEncryptionPadding 填充)位于 NxtUtils.Security.EncryptionManager..ctor(KeyBundle cryptoKey) 中 C:\Repos\Enigma\EnigmaPrototype\SharedLibaries\NxtUtils\Security\EncryptionManager.cs:line 26

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

谢谢!

c# .net azure encryption rsa
3个回答
1
投票

我遇到了同样的问题,尽管我从互联网上搜索并从 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;
        }
    }

}


0
投票

ToRSA 有一个默认布尔参数,指示私钥是否可用。

由于您没有明确地说

true
它是隐含的
false
,因此您的关键对象是公开的。 使用 RSA 公钥,您可以加密数据或验证签名,但无法签名或解密。


0
投票

Jim Xu 的答案中存在一个更简单的解决方案:使用 Azure Key Vault 的密钥来加密和解密文本。 我用过它并且有效。

© www.soinside.com 2019 - 2024. All rights reserved.