因为我是加密概念的新手。我应该做的是发送通过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);
答案 0 :(得分:1)
IV不需要保持安全。通常将IV添加到密文并将它们一起发送。接收端使用传入消息的前128位作为IV,并将其余部分视为密文。
当然,密钥需要在RSA(或等效)加密下单独发送。