按线路加密/解密文件



我是对加密的新手,我正在尝试获得一个逐线加密人的工作;在应用程序运行期间,我需要能够将加密线附加到文件上,而不仅仅是一个巨大的巨大加密供电。我有一段时间的野兽。这是我的总体,在我自己的几次失败尝试之后,无耻地被偷走了:


class Encryption
    {
        private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
        public static byte[] Encrypt(byte[] plain, string password)
        {
            MemoryStream memoryStream;
            CryptoStream cryptoStream;
            Rijndael rijndael = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
            rijndael.Key = pdb.GetBytes(32);
            rijndael.IV = pdb.GetBytes(16);
            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(plain, 0, plain.Length);
            cryptoStream.FlushFinalBlock();
            cryptoStream.Close();
            return memoryStream.ToArray();
        }
        public static byte[] Decrypt(byte[] cipher, string password)
        {
            MemoryStream memoryStream;
            CryptoStream cryptoStream;
            Rijndael rijndael = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
            rijndael.Key = pdb.GetBytes(32);
            rijndael.IV = pdb.GetBytes(16);
            memoryStream = new MemoryStream();
            cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(cipher, 0, cipher.Length);
            cryptoStream.FlushFinalBlock();
            cryptoStream.Close();
            return memoryStream.ToArray();
        }
    }

这是一个虚拟函数,显示我如何尝试:

       私有void Encryptfile(字符串filepath,字符串输出路径,字符串密码)        {            FileInfo FileInfo = new FileInfo(filepath);            字符串fileName = fileInfo.name;            字符串fullPath = outputpath  " \"  文件名;            binaryWriter writer = new BinaryWriter(file.openwrite(fullPath),encoding.ascii);           ///我在这里尝试的两种方法:           ///1.所需的方法:逐行加密 - 我认为我能够生成           ///多个数据块,然后将其解密。这不起作用           //string [] lines = file.readalllines(filepath);           ///2.只需阅读整个内容,然后对其进行加密并一口气写。            字符串线= file.readallText(filepath);           //foreach(线中的字符串线)            {                字节[]字节= encoding.ascii.getBytes(line);                byte []编码= engryption.encrypt(字节,密码);                writer.write(编码);                writer.flush();            }            writer.close();        }        私有void decryptfile(字符串filepath,字符串输出路径,字符串密码)        {            FileInfo FileInfo = new FileInfo(filepath);            字符串fileName = fileInfo.name;            字符串fullPath = outputpath  " \"  文件名;            StreamWriter Writer = new StreamWriter(FullPath,false,encoding.utf8);            字节[]字节= file.readallBytes(filepath);           ///这是目前正在使用解密的方法;只是           ///获取所有数据,然后一口气将其解密。            字节[]解密= engryption.decrypt(bytes,passwass);            字符串s = encoding.ascii.getString(解密);            writer.write(s);            writer.flush();           ///我在这里尝试了许多事情,以按线进行解密,           ///什么都没有。这崩溃了有关填充的问题           ///无效。           /*            int index = 0;            int count = 32;            while(索引

我不完全确定我应该做什么。我一直在徘徊,浏览事物并在线阅读示例,但是它们似乎都是如何加密整个文件或只是加密数据,而无能为力,只不过立即解密它。我应该如何处理逐条写作?

而不是为您编程,我会给您一个可以实现的方案。

如果您有每行加密,我认为您也希望每行解密。请注意,对于计算机来说,"线"是一个不便的术语。这只是一堆以某种线条终结者结尾的字符。字符本身是使用特定字符编码编码的。

此外,我将做以下假设:

  • 应用行呈现加密文本,这意味着字节需要从二进制转换为字符(使用编码);
  • 您希望使用一个键,同时保持安全;
  • 您不需要密码文本的完整性保护或身份验证,只有机密性。

现在这个想法很简单:

  1. 使用基于密码的键推导函数创建一个键;
  2. 打开文本文件以读取(使用正确的字符编码);
  3. 读取一条线,然后将行再次转换为字节(例如,使用UTF-8);
  4. 创建一个输出流,该输出流在下面创建字节数组;
  5. 创建一个随机IV并将其写入字节数组(IV始终是单个块大小);
  6. 创建一个加密流并将其连接到同一输出流;
  7. 加密编码行;
  8. 基本64编码加密字节,并确保其停留在一行中;
  9. 将编码的,加密的行写入新的文本文件。

进行相反的操作,逆转过程,尽管应从基础64解码后从字节中检索IV,并且当然应该使用与加密过程中使用的相同方法来计算密钥。

相关内容

  • 没有找到相关文章

最新更新