首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从密码流读取到流的末尾

从密码流读取到流的末尾
EN

Stack Overflow用户
提问于 2012-03-16 01:03:16
回答 2查看 24.7K关注 0票数 7

我在下面的代码中遇到了一些问题。我在一个临时位置有一个需要加密的文件,此函数加密该数据,然后将其存储在"pathToSave“位置。

在检查时,is似乎没有正确处理整个文件-我的输出中缺少一些位,我怀疑这与while循环没有在整个流中运行有关。

另外,如果我尝试在while循环之后调用CryptStrm.Close(),我会收到一个异常。这意味着,如果我试图解密文件,我会得到一个文件已在使用错误!

尝试了所有常见的方法,我在这里看到了类似的问题,任何帮助都会很好。

谢谢

代码语言:javascript
运行
复制
public void EncryptFile(String tempPath, String pathToSave)
    {
        try
        {
            FileStream InputFile = new FileStream(tempPath, FileMode.Open, FileAccess.Read);
            FileStream OutputFile = new FileStream(pathToSave, FileMode.Create, FileAccess.Write);

            RijndaelManaged RijCrypto = new RijndaelManaged();

            //Key
            byte[] Key = new byte[32] { ... };

            //Initialisation Vector
            byte[] IV = new byte[32] { ... };

            RijCrypto.Padding = PaddingMode.None;
            RijCrypto.KeySize = 256;
            RijCrypto.BlockSize = 256;
            RijCrypto.Key = Key;
            RijCrypto.IV = IV;

            ICryptoTransform Encryptor = RijCrypto.CreateEncryptor(Key, IV);

            CryptoStream CryptStrm = new CryptoStream(OutputFile, Encryptor, CryptoStreamMode.Write);

            int data;
            while (-1 != (data = InputFile.ReadByte()))
            {
                CryptStrm.WriteByte((byte)data);
            }
        }
        catch (Exception EncEx)
        {
            throw new Exception("Encoding Error: " + EncEx.Message);
        }
    }

编辑:

我假设我的问题与加密有关。我的解密可能就是罪魁祸首

代码语言:javascript
运行
复制
        public String DecryptFile(String encryptedFilePath)
    {
        FileStream InputFile = new FileStream(encryptedFilePath, FileMode.Open, FileAccess.Read);

        RijndaelManaged RijCrypto = new RijndaelManaged();

        //Key
        byte[] Key = new byte[32] { ... };

        //Initialisation Vector
        byte[] IV = new byte[32] { ... };

        RijCrypto.Padding = PaddingMode.None;
        RijCrypto.KeySize = 256;
        RijCrypto.BlockSize = 256;
        RijCrypto.Key = Key;
        RijCrypto.IV = IV;

        ICryptoTransform Decryptor = RijCrypto.CreateDecryptor(Key, IV);

        CryptoStream CryptStrm = new CryptoStream(InputFile, Decryptor, CryptoStreamMode.Read);

        String OutputFilePath = Path.GetTempPath() + "myfile.name";
        StreamWriter OutputFile = new StreamWriter(OutputFilePath);

        OutputFile.Write(new StreamReader(CryptStrm).ReadToEnd());

        CryptStrm.Close();
        OutputFile.Close();

        return OutputFilePath;
    }
EN

回答 2

Stack Overflow用户

发布于 2020-02-05 19:58:17

另一种读取CryptoStream的方法是使用CopyTo方法:

代码语言:javascript
运行
复制
...

    using (var output = new MemoryStream())
    {
       cryptStream.CopyTo(output);
       return output.ToArray();
    }

...
票数 2
EN

Stack Overflow用户

发布于 2019-01-18 04:08:57

必须先指定KeySize。这看起来像是个bug

代码语言:javascript
运行
复制
            using (var aes = new AesManaged())
            {
                aes.KeySize = 256;
                aes.Mode = CipherMode.CBC;
                aes.IV = iv;
                aes.Key = passwordHash;
                aes.Padding = PaddingMode.PKCS7;

但这不是

代码语言:javascript
运行
复制
            using (var aes = new AesManaged())
            {
                aes.Mode = CipherMode.CBC;
                aes.IV = iv;
                aes.Key = passwordHash;
                aes.Padding = PaddingMode.PKCS7;
                aes.KeySize = 256;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9724598

复制
相关文章

相似问题

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