我正在编写一个程序,其工作方式如下:
问题是我在用C#编写它时遇到了麻烦。我需要为我的AES加密使用初始化向量(IV),我尝试使用公共RSA密钥对其进行加密,但512(2 * 256)大小大于RSA所能承受的长度。所以我想出了一个办法,由于我每次都像AES密钥一样随机创建初始化向量,所以我可以将IV添加到AES密文的前面。但我不知道在我的函数中插入执行此操作的代码应该放在哪里。
能提供关于“协议”或其他将IV写入密文的方法的帮助将是非常好的。谢谢。
- 我有一些机密的日志文件需要备份到服务器。
- 我有一个程序每天生成这些日志文件。
- 这些日志文件极少需要被打开。
- 我只有一对RSA公钥/私钥。
- 该程序仅拥有RSA公钥。
- 每次程序制作机密文件时,我都会生成一个随机的AES密钥。
- 程序使用此AES密钥加密日志文件。
- 然后我使用RSA公钥加密AES密钥。
- 然后将AES加密文件和RSA加密AES密钥两者备份到服务器上。
问题是我在用C#编写它时遇到了麻烦。我需要为我的AES加密使用初始化向量(IV),我尝试使用公共RSA密钥对其进行加密,但512(2 * 256)大小大于RSA所能承受的长度。所以我想出了一个办法,由于我每次都像AES密钥一样随机创建初始化向量,所以我可以将IV添加到AES密文的前面。但我不知道在我的函数中插入执行此操作的代码应该放在哪里。
能提供关于“协议”或其他将IV写入密文的方法的帮助将是非常好的。谢谢。
static public Tuple<byte[], byte[]> EncryptAES(byte[] toEncryptAES, RSAParameters RSAPublicKey)
{
byte[] encryptedAES = null;
byte[] encryptedRSA = null;
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
AES.Mode = CipherMode.CBC;
AES.GenerateIV();
AES.GenerateKey();
encryptedRSA = RSAEncrypt(AES.Key, RSAPublicKey);
using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
ms.Write(AES.IV, 0, AES.KeySize); //DOESNT WORK HERE
//Can't use CS to write it to the stream else it will encrypt along with file
cs.Write(toEncryptAES, 0, toEncryptAES.Length);
cs.Close();
}
encryptedAES = ms.ToArray();
}
}
return new Tuple<byte[], byte[]>(encryptedAES, encryptedRSA);
}
static public byte[] DecryptAES(byte[] toDecryptAES, byte[] AESKeyAndIV, RSAParameters RSAPrivateKey)
{
byte[] AESKey = RSADecrypt(AESKeyAndIV, RSAPrivateKey);
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
AES.Key = AESKey;
ms.Read(AES.IV, 0, AES.KeySize); //Not sure if can read MS here
AES.Mode = CipherMode.CBC;
using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
{
//Would I need to move 0 to 256?
cs.Write(toDecryptAES, 0, toDecryptAES.Length);
cs.Close();
}
return ms.ToArray();
}
}
}