逐行加密/解密文件?

2024-05-19

我对加密还很陌生,我正在尝试让逐行加密器工作;我需要能够在应用程序运行期间将加密行附加到文件中,而不仅仅是一大堆加密所有内容并保存。不过我玩得很开心。这是我的加密器,在我自己多次尝试失败后被无耻地窃取:


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();
        }
    }

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




       private void EncryptFile(string filepath, string outputPath, string password)
        {
            FileInfo fileInfo = new FileInfo(filepath);
            string filename = fileInfo.Name;

            string fullpath = outputPath + "\\" + filename;

            BinaryWriter writer = new BinaryWriter(File.OpenWrite(fullpath), Encoding.ASCII);

            /// Two methods that I've attempted here:
            /// 1.  The desired method: encrypt line by line - I assumed I'd be able to generate
            ///     multiple blocks of data and decrypt them later.  This isn't working

            //string[] lines = File.ReadAllLines(filepath);

            /// 2.  Just read the whole thing and encrypt and write it in one swoop.

            string line = File.ReadAllText(filepath);

            //foreach(string line in lines)
            {
                byte[] bytes = Encoding.ASCII.GetBytes(line);
                byte[] encoded = Encryption.Encrypt(bytes, password);

                writer.Write(encoded);
                writer.Flush();
            }

            writer.Close();
        }



        private void DecryptFile(string filepath, string outputPath, string password)
        {
            FileInfo fileInfo = new FileInfo(filepath);
            string filename = fileInfo.Name;
            string fullpath = outputPath + "\\" + filename;

            StreamWriter writer = new StreamWriter(fullpath, false, Encoding.UTF8);

            byte[] bytes = File.ReadAllBytes(filepath);

            ///  Here is the method that's working at the moment for decrypting; just
            ///  grab all the data and decrypt it on one swoop.

            byte[] decrypted = Encryption.Decrypt(bytes, password);

            string s = Encoding.ASCII.GetString(decrypted);

            writer.Write(s);
            writer.Flush();


            ///  I've tried a number of things here to decrypt line by line,
            ///  none of which work.  This crashes with an issue about the padding
            ///  being invalid.  

            /*
            int index = 0;
            int count = 32;

            while (index   

我不完全确定我应该做什么了。我一直在网上闲逛并阅读示例,但它们似乎都是如何加密整个文件或只是加密一段数据并且除了立即再次解密之外不对其执行任何操作。我应该如何处理逐行写作?


我不会为您编写此程序,而是为您提供一个可以实施的方案。

如果您有每行加密,我想您也希望能够解密每行。请注意,“线”对于计算机来说是一个相当不方便的术语。它只是一堆以某种行终止符结尾的字符。字符本身是使用特定的编码字符编码 /questions/tagged/character-encoding.

此外,我将做出以下假设:

  • 加密文本应以行形式呈现,这意味着字节需要从二进制转换为字符(使用encoding /questions/tagged/encoding);
  • 您希望使用单一密钥,同时保持安全;
  • 您不需要完整性保护或密文验证,只需要机密性。

现在的想法很简单:

  1. 使用基于密码的密钥派生函数创建单个密钥;
  2. 打开文本文件进行阅读(使用正确的字符编码 /questions/tagged/character-encoding);
  3. 读取一行并再次将该行转换为字节(例如使用 UTF-8);
  4. 创建一个输出流,该输出流在下面创建一个字节数组;
  5. 创建一个随机 IV 并将其写入字节数组(IV 始终是单个块大小);
  6. 创建一个加密流并将其连接到相同的输出流;
  7. 加密编码行;
  8. 对加密字节进行 Base 64 编码,并确保其位于一行;
  9. 将编码的加密行写入新的文本文件。

要执行相反的操作,请颠倒该过程,尽管 IV 应从 Base 64 解码后的字节中检索,并且密钥当然应使用与加密期间使用的相同方法来计算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逐行加密/解密文件? 的相关文章

随机推荐

  • SQL Server 查询中 UNION ALL 与 OR 条件

    我必须根据表上不存在的条件选择一些行 如果我使用如下的 union all 它会在不到 1 秒的时间内执行 SELECT 1 FROM dummyTable WHERE NOT EXISTS SELECT 1 FROM TABLE t WH
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • Microsoft Graph 查询中的不同值

    我想列出 Microsoft Graph graph microsoft com 中的所有部门名称 我想做到这一点的唯一方法是通过用户列表 如果我错了 请纠正我 所以我的问题是 有什么方法可以查询用户的部门并且仅查询部门的不同值 This
  • “修改列”与“更改列”

    我知道 我们不能使用重命名列MODIFY COLUMN语法 但我们可以使用CHANGE COLUMN syntax 我的问题是 主要用途是什么modify syntax 例如 ALATER TABLE tablename CHANGE co
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • 异步多播委托

    我最近在一个广泛使用事件的项目上做了一些工作 我需要做的事情之一是在多播委托上异步调用多个事件处理程序 我认为诀窍是对 GetInvocableList 中的每个项目调用 BeginInvoke 但似乎那里不存在 BeginInvoke 有
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • 使用 LINQ 选择单个列表的所有唯一组合,不重复(第 2 部分)

    约翰 斯基茨回答了这个问题 使用 LINQ 选择单个列表的所有唯一组合 不重复 https stackoverflow com questions 3479980 select all unique combinations of a si
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 带 url 参数的 Laravel post 路由

    我面临着幼虫路由的大墙 我似乎找不到解决方案 我在视图模板中有此表单
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 匹配所有有效格式 IPv6 地址的正则表达式

    乍一看 我承认这个问题看起来像是这个问题以及与之相关的任何其他问题的重复 匹配有效 IPv6 地址的正则表达式 https stackoverflow com questions 53497 regular expression that
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • 我可以将 Visual Studio 配置为在 C++ 项目中使用真实文件夹而不是筛选器吗?

    必须单独维护 filters 文件以使 Visual Studio 满意 以及我的项目的磁盘布局 这很烦人 是否可以告诉 VS 使用真实文件夹 就像 C 那样 在 Visual Studio 的解决方案资源管理器中 只需单击名为 显示所有文
  • React 应用程序中的 addEventListener 不起作用

    一些背景 我正在尝试消费自定义网络组件在 React 应用程序中并尝试监听来自 Web 组件的事件 我相信您不能只在自定义 Web 组件上以通常的反应方式处理事件 i e
  • Django order_by() 过滤器与distinct()

    我怎样才能做一个order by像这样 p Product objects filter vendornumber 403516006 order by created distinct vendor name 问题是我有多个同名的供应商
  • Angular 2 错误:无效的提供程序 - 仅允许提供程序和类型的实例,得到:[object Object]

    我正在将 ui router2 与 angular2 rc 4 集成 但我得到了 错误 无效的提供程序 仅允许提供程序和类型的实例 得到 object Object 以下是引导代码 import trace UIROUTER PROVIDE
  • 我应该在构造函数中调用成员函数吗

    我知道这是一个相当简单的问题 并且还取决于代码的其余部分 但我对经验法则更感兴趣 那么什么情况下适合在构造函数中调用函数呢 更可取的是 ClassA obj1 obj1 memFun or ClassA obj1 where constru
  • 如何在CentOS 5.3上安装php-mongodb?

    我已经在我的 VPS 上安装了 mongoDB 效果很好 现在我想安装 php 驱动程序以使 php 与 mongoDB 一起工作 我跟着蒙戈安装 http www php net manual en mongo installation
  • 逐行加密/解密文件?

    我对加密还很陌生 我正在尝试让逐行加密器工作 我需要能够在应用程序运行期间将加密行附加到文件中 而不仅仅是一大堆加密所有内容并保存 不过我玩得很开心 这是我的加密器 在我自己多次尝试失败后被无耻地窃取 class Encryption pr