我是很新的C#和加密,请宽容我。 我想节省一些二进制数据(“对象” - 其实大多只有对象的部分,因此,我不能/不会使用序列,和的BinaryWriter相似),我想它在内存中进行加密,然后使用的FileStream写。 起初我想用某种异或的,但我不知道它是那么容易打破,现在我改变了代码,使用AES。
事情是,我会有一些比较大的文件,而且经常我只需要改变或读取像32个字节的数据。 因此,我必须能够仅加密一个数据块的并且还能够对数据进行解密的唯一所需块的。 现在我来到了仅与下面的解决方案。
当通过所有的数据和循环内保存的数据我环路加密数据块,并将其写入文件。 一边读书,我有循环读取数据和环路我必须声明解密块里面,我觉得这非常低效的。
下面是加密和保存的代码:
//setup file stream for saving data
FileStream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 1024, false);
//setup encryption (AES)
SymmetricAlgorithm aes = Aes.Create();
byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
aes.Padding = PaddingMode.None;
ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);
foreach(....)
{
//data manipulation
//encryption
MemoryStream m = new MemoryStream();
using (Stream c = new CryptoStream(m, encryptor, CryptoStreamMode.Write))
c.Write(data, 0, data.Length);
byte[] original = new byte[32];
original = m.ToArray();
fStream.Write(original, 0, original.Length);
}
密钥和IV是硬编码只是为了能够更容易调试和解决问题,一旦这将工作我会改的方向键和IV产生。
下面是阅读与解密代码:fstream的的FileStream =新的FileStream(文件名,FileMode.Open,FileAccess.Read,FileShare.Read,4096,FALSE);
//setup encryption (AES)
SymmetricAlgorithm aes = Aes.Create();
byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
aes.Padding = PaddingMode.None;
//reading
while (numBytesToRead > 0)
{
byte[] original = new byte[32];
byte[] data = new byte[32];
int len = fStream.Read(original, 0, 32);
//error checking ...
//decryption
ICryptoTransform decryptor = aes.CreateDecryptor(key, iv); //this is a slow operation
MemoryStream m = new MemoryStream();
using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
c.Write(original, 0, original.Length);
data = m.ToArray();
//data manipulation ...
}
那么事情是,我觉得非常低效的创建循环中的解密。 会有相当多的数据。 如果我在进入循环然后我不能正确地解密之前创建它,必须改变加密(声明加密流和循环之前内存流),但是然后我不能加密/解密只有期望的数据的块。 也没有很多的文件,这将只需要随机读/写。 例如,在一些文件,我会想从某个位置,直到文件的末尾,它可以是相当多的阅读。
请问你对此有何看法? 有没有更好的方式来实现这一目标? 也许不同的加密算法(在我想用某种异或的,但我发现它是非常容易“破解”开头)?
PS我想在内存中加密和我必须使用查找流。