0

我正在使用下面的代码来加密和解密文件:

// 加密

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 部分并解密文件,但它不起作用,并且出现长度无效异常。

提前致谢。

4

1 回答 1

2

根据要求发布我的评论作为答案。

你说

我尝试调用 ReadByte() 10 次,然后转到 WHILE 部分并解密文件,但它不起作用,并且出现长度无效异常。

但是您并没有确切说明您在哪个流上调用 ReadByte() 10 次以及您何时调用它。

确保fsCrypt 实例化新的CryptoStream.

另请注意,您可能只调用fsCrypt.Position = 10;or 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并读取其余部分。

于 2015-02-17T12:09:47.933 回答