首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从cryptoStream readByte()中的任意索引(偏移)开始

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

Stack Overflow用户
提问于 2015-02-10 13:47:09
回答 1查看 518关注 0票数 0

我使用下面的代码加密和解密一个文件:

//加密

代码语言:javascript
运行
复制
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();

//解密

代码语言:javascript
运行
复制
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字节文件没有加密,而是使用简单的filestream创建的,可以在记事本中读取。

现在,在解密代码中,我如何消除前10个字节并解密文件中的数据?

我尝试调用ReadByte() 10次,然后转到WHILE部件和解密文件,但它不工作,我得到长度无效的异常。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 12:09:47

发表我的评论,作为回应的要求。

你说

我尝试调用ReadByte() 10次,然后转到WHILE部件和解密文件,但它不工作,我得到长度无效的异常。

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

在实例化新的fsCrypt之前,一定要在CryptoStream上调用它。

还请注意,您可能只需调用fsCrypt.Position = 10;fsCrypt.Seek(10, SeekOrigin.Begin),而不是读取10个虚拟字节,因为FileStream支持查找。

例如:

代码语言:javascript
运行
复制
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,然后读取其余的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28433248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档