如何从 cryptoStream readByte() 中的任意索引(偏移量)开始

How to start from arbitrary index (offset) in cryptoStream readByte()

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

// 加密

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

提前致谢。

根据要求张贴我的评论作为答案。

你说

I've tried to call ReadByte() for 10 times, and then goto the WHILE part and decrypt file, but it doesn't work and I get length invalid exception.

但是您没有确切说明您调用 ReadByte() 10 次 ,以及何时 确切地 调用它。

确保在 fsCrypt 上调用它,然后 实例化新的 CryptoStream

另请注意,您可能只调用 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 都需要不同,但可以 public。一种常见的技术是每次要加密时随机生成一个 IV,并将其作为加密流的前 N ​​个字节。解密时,自己读取加密流的前N个字节(在创建CryptoStream之前),将其设置为IV,打开CryptoStream,然后读取其余部分。