当前位置: 首页 > 知识库问答 >
问题:

Azure Key Vault-检索RSA公钥以进行内部部署加密

公孙琛
2023-03-14

我正在尝试以以下方式使用已在Azure密钥库中生成的RSA密钥:

  1. 找回公钥
  2. 用它加密一些文本数据(-locally-)
  3. 使用Azure Key Vault解密它(在不同的应用程序中)

我已经设法做到的是:

            string clientId = "XYZ";
            string tenantId = "ABC";
            string clientSecret = "123";

            string keyVaultName = "kvn";
            string keyVaultKeyName = "kvkn";
            string textToEncrypt = "StuffIDoNotWantYouToKnow";

            ClientSecretCredential clientSecretCredential = new ClientSecretCredential(
                tenantId, // your tenant id
                clientId, // your AD application appId
                clientSecret // your AD application app secret
            );


            //get key
            KeyClient keyClient = new KeyClient(new Uri($"https://{keyVaultName}.vault.azure.net/"), clientSecretCredential); ;
            var key = keyClient.GetKey(keyVaultKeyName);

我目前正在努力理解的是如何使用检索到的密钥来加密文本数据。

任何帮助将不胜感激!

P. S我使用。NET框架4.6.1

共有1个答案

宇文良骏
2023-03-14

解决了它

private static string clientId;
private static string tenantId;
private static string clientSecret;

private static string keyVaultName;
private static string keyVaultKeyName;

private static ClientSecretCredential clientSecretCredential;

public static void Main(string[] args)
{
    PopulateParams();

    KeyClient keyClient = new KeyClient(new Uri($"https://{keyVaultName}.vault.azure.net/"), clientSecretCredential); ;
    var key = keyClient.GetKey(keyVaultKeyName);

    byte[] N = key.Value.Key.N; //modulus
    byte[] E = key.Value.Key.E; //exponent

    string textToEncrypt = "StuffIDoNotWantYouToKnow";
    byte[] encryptedData = EncryptLocally(textToEncrypt, N, E);
    string res = DecryptRemotely(key.Value.Id, encryptedData);
    Console.WriteLine(res);
}

public static void PopulateParams()
{
    //TODO not hard coded
    clientId = "XYZ";
    tenantId = "ABC";
    clientSecret = "123";

    keyVaultName = "kvm";
    keyVaultKeyName = "kvkm";

    clientSecretCredential = new ClientSecretCredential(
        tenantId,
        clientId,
        clientSecret
    );
}

public static byte[] EncryptLocally(string data, byte[] N, byte[] E)
{
    byte[] encryptedData = null;

    try
    {
        RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
        RSAParameters RSAKeyInfo = new RSAParameters();

        //Set RSAKeyInfo to the public key values. 
        RSAKeyInfo.Modulus = N;
        RSAKeyInfo.Exponent = E;

        RSA.ImportParameters(RSAKeyInfo);

        byte[] dataBytes = Encoding.ASCII.GetBytes(data);

        encryptedData = RSA.Encrypt(dataBytes, true);
    }
    catch (CryptographicException e)
    {
        Console.WriteLine(e);
    }

    return encryptedData;
}

public static string DecryptRemotely(Uri keyId, byte[] encryptedData)
{
    string decryptedText = null;

    CryptographyClient cryptoClient = new CryptographyClient(keyId, clientSecretCredential);

    var decryptedBytes = cryptoClient.Decrypt(EncryptionAlgorithm.RsaOaep, encryptedData);
    decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes.Plaintext);

    return decryptedText;
}
 类似资料:
  • 我正在为服务器编写发送电子邮件的模块。在客户端应用程序中,用户可以添加多个接收器,每个接收器都有自己的公钥。我想使用多个密钥加密附件。例如,如果我添加了3个接收者,那么附件应该用3个不同的公钥加密。我使用bouncy castle来实现这一点,但它只适用于加密过程中的第一个公钥。我的意思是只有第一个人可以使用自己的私钥解密,其余的都不起作用。我为每个键添加方法的代码如下所示: 整个方法看起来像:

  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 说明 微信支付-获取RSA加密公钥SDK,企业付款到银行卡接口需要。 你还需要执行openssl rsa -RSAPublicKey_in -in weixin-rsa-public.pem -pubout 将命令行输出的证书内容覆盖到weixin-rsa-public.pem文件中才可使用 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch

  • 我使用RSA_public_encrypt函数发送加密数据到套接字。我正在读取公钥。使用"pkey=PEM_read_PUBKEY(f, NULL, NULL, NULL);"函数的PEM文件。从上面的函数中检索的pkey是类型EVP_PKEY*,我不能在函数RSA_public_encrypt中使用。(RSA_public_encrypt使用RSA*类型密钥) 如何将EVP_PKEY*PKEY转

  • 我们需要使用Azure key vault创建RSA密钥对,并将RSA公钥复制到外部系统。其要求是外部系统使用公钥加密数据,内部系统与azure key vault对话并对数据进行解密。我还没有访问Azure key vault的权限,所以需要查看文档。我有两个基本问题: > 有没有一种方法可以使用Azure portal以文本格式导出RSA公钥,而不使用API(https://docs.micr

  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(