我正在使用以下代码加密和解密文件:
//加密
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes("password");
FileStream fsCrypt = new FileStream("cryptFile", FileMode,create);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream("FileName", FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
cs.WriteByte((byte)data);
fsIn.Close();
cs.Close();
fsCrypt.Close();
//解密
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes("password");
FileStream fsCrypt = new FileStream("filename", FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
int data;
while ((data = cs.ReadByte()) != -1)
memorystream.WriteByte((byte)data);
它运行良好,没有任何问题!
出于某些原因,我在加密文件的第一个位置添加了10个字节!实际上,我已经创建了一个10字节的文件(文件大小正好是10字节),然后我将加密的文件附加到这个文件中。
请注意,这个10字节的文件没有加密,而是使用简单的文件流创建的,并且可以在记事本中读取。
现在在解密代码中,我如何消除前10个字节并解密文件中的剩余数据?
我已经尝试调用ReadByte()10次了,然后转到WHILE部分并解密文件,但它不起作用,我得到了长度无效的异常。
提前谢谢。
根据请求发布我的评论作为回复。
你说
我已经尝试调用ReadByte()10次了,然后转到WHILE部分并解密文件,但它不起作用,并且我得到的长度无效例外
但你没有确切地说出你在上调用ReadByte()10次的流,以及当准确地时调用它。
在实例化新的CryptoStream
之前,请确保在fsCrypt
上调用它。
还要注意,您可能只需要调用fsCrypt.Position = 10;
或fsCrypt.Seek(10, SeekOrigin.Begin)
,而不是读取10个伪字节,因为FileStream
支持查找。
例如:
byte[] key = Encoding.Unicode.GetBytes("password");
FileStream fsCrypt = File.OpenRead("filename");
fsCrypt.Position = 10; // Skip the 10 useless bytes at the start
RijndaelManaged rijndaelManaged = new RijndaelManaged();
// Disposing CryptoStream will also dispose the FileStream passed to it
using (CryptoStream cryptoStream = new CryptoStream(fsCrypt, rijndaelManaged.CreateDecryptor(key, key), CryptoStreamMode.Read))
{
cryptoStream.CopyTo(memoryStream);
}
顺便说一句:不要把钥匙当作IV
每次加密某些内容时,IV都需要有所不同,但可以是公开的。一种常见的技术是,每当你想加密某个东西时,随机生成一个IV,并将其作为加密流的前N个字节。当涉及到解密时,您自己读取加密流的前N个字节(在创建CryptoStream
之前),将其设置为IV,打开CryptoStream
,然后读取其余部分。