如何从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部分并解密文件,但它不起作用,我得到了长度无效的异常。

提前谢谢。

根据请求发布我的评论作为回复。

你说

我已经尝试调用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,然后读取其余部分。

最新更新