如何使用AES加密中的会话密钥传输启动向量

时间:2015-04-24 11:08:51

标签: c# encryption aes

因为我是加密概念的新手。我应该做的是发送通过AES对称技术加密的数据的应用程序。另外,我需要使用非对称RSA技术以加密格式的形式发送我用于加密的密钥。我使用AES对称加密技术使用256位密钥完成加密,现在我已经加密了数据,密钥和启动向量(IV),以字节为单位。当我试图解密时,我知道启动向量也需要获得确切的数据。

现在我的问题是

1.如何将带有启动矢量IV的密钥发送给另一只手?

2.我是否需要将其与加密数据或字节键一起加入。使用密钥发送启动向量的标准方法是什么?

3.i需要使用公钥以非对称加密方法加密密钥。用私钥解密后,他们如何能够读取密钥和IV;

我在C#中的AES加密代码:

public byte[] SymmetricAESEncryption(string plainText, byte[] key, byte[] initVector)
    {
        byte[] encrypted;
        using (Aes objAES = Aes.Create())
        {
            objAES.KeySize = 256;

            ICryptoTransform encryptor = objAES.CreateEncryptor(key, initVector);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }
        return encrypted;
    } 

C#中的AES解密代码:

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        string plaintext = null;
        using (Aes rijAlg = Aes.Create())
        {
            rijAlg.Key = Key;
            rijAlg.IV = IV;
            ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }

        }
        return plaintext;

    }

我在C#中的非对称代码<​​/ p>

X509Certificate2 objCertificate = new X509Certificate2();
        objCertificate.Import(Encoding.UTF8.GetBytes(rawData.ToString().Trim()));

        RSACryptoServiceProvider objAsyAlgm1 = (RSACryptoServiceProvider)objCertificate.PublicKey.Key;

        byte[] SessionKeyEncryptValue = objAsyAlgm1.Encrypt(sessionKey, false);

1 个答案:

答案 0 :(得分:1)

IV不需要保持安全。通常将IV添加到密文并将它们一起发送。接收端使用传入消息的前128位作为IV,并将其余部分视为密文。

当然,密钥需要在RSA(或等效)加密下单独发送。