我已设置 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?
谢谢!
我遇到了同样的问题,尽管我从互联网上搜索并从 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;
}
}
}
Jim Xu 的答案中存在一个更简单的解决方案:使用 Azure Key Vault 的密钥来加密和解密文本。 我用过它并且有效。