【问题标题】:Using Azure Key Vault RSA Key to encrypt and decrypt strings使用 Azure Key Vault RSA Key 加密和解密字符串
【发布时间】:2018-12-08 18:03:27
【问题描述】:

我已设置 Azure Key Vault 以检索 RSA 密钥进行加密。 Azure 向我发送一个 KeyBundle 类型的对象。此对象包含一个 大小为 2048 的 RSA 类型的 JsonWebKey。查看我的 RSA 密钥,它有两种方法,称为 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 输入,AsymmetricPaddingMode paddingMode,Void* paddingInfo,布尔加密)在 System.Security.Cryptography.RSAImplementation.RSACng.EncryptOrDecrypt(字节[] 数据,RSAEncryptionPadding 填充,布尔加密)在 System.Security.Cryptography.RSAImplementation.RSACng.Decrypt(字节[] 数据,RSAEncryptionPadding 填充)在 NxtUtils.Security.EncryptionManager..ctor(KeyBundle encryptionKey) 在 C:\Repos\Enigma\EnigmaPrototype\SharedLibaries\NxtUtils\Security\EncryptionManager.cs:line 26

我真的不熟悉密码算法。我的问题是:如何使用 Azure 提供的 RSA 密钥加密和解密一个简单的字符串?

谢谢!

【问题讨论】:

  • "但是解密会抛出异常。"我没看到。

标签: c# .net azure encryption rsa


【解决方案1】:

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

由于您没有明确地说true,它隐含地是false,因此您的密钥对象是仅公开的。使用公共 RSA 密钥,您可以加密数据或验证签名,但不能签名或解密。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2018-05-06
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2021-12-13
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多