在 .NET 中使用 OpenSSL 加密和解密文件

2024-01-03

我在 C# 项目中使用 OpenSSL Crypto 库来加密/解密文件。这是我的代码:

byte[] key = System.Text.Encoding.ASCII.GetBytes("password");

byte[] iv = System.Text.Encoding.ASCII.GetBytes("1234");


OpenSSL.Crypto.CipherContext cc = new OpenSSL.Crypto.CipherContext(
    OpenSSL.Crypto.Cipher.AES_256_ECB);

FileStream fIn = new FileStream("C:\\file.txt", FileMode.Open, 
    FileAccess.Read);
FileStream fOut = new FileStream("C:\\encrypted.txt", FileMode.OpenOrCreate,
    FileAccess.Write);
fOut.SetLength(0);

byte[] bin = new byte[100];
long rdlen = 0;
long totlen = fIn.Length;
int len;

DateTime start = DateTime.Now;
while (rdlen < totlen)
{
    // argument 1
    len = fIn.Read(bin, 0, 100);         
    // argument 2
    fOut.Write(cc.Crypt(bin,key,iv,true),0,100);                 
    rdlen = rdlen + len;
}

fOut.Flush();  
fOut.Close();
fIn.Close();

结果我得到了这个异常:

偏移量和长度超出范围 对于数组或计数大于 从索引到的元素数量 源集合结束。

当我将参数 1 和 2 的值从 100 更改为 64 时(bin 仍然始终是 byte[100]) 它工作了,文件被加密和解密,但解密文件的大小比原始文件大,并且在文本文件末尾包含 1 或 2 行以上。


我不知道这个库,但这里的一个问题是,您正在使用 256 位 = 32 字节的块大小加密 100 字节的块。您的块应该是 32 字节的倍数。文件末尾的额外字节可能只是将最终块四舍五入到 32 字节。

正如 Philip 的回答所示,崩溃的可能原因是 Write 中的硬编码 100。 Crypt 函数将从其加密的最终块中返回 32、64 或 96 字节之一,这些字节都小于 100。(在有效的 100 字节情况下,您的数据可能会被填充到加密的 128 字节,并且因此,当您只写入 100 时,就会丢失最后一个块的最后 28 个字节。)

Also

  1. 你正在 ECB 模式下传递 IV - 你不需要这个
  2. 通过重复调用 Crypt,您可能会为每 100 个字节进行密钥设置。这是低效的;您只需在加密开始时执行一次。您应该寻找一种方法来使用密钥(以及其他模式中的 IV)初始化类,然后立即向其提供数据块进行加密,而不是每次都使用密钥调用 Crypt。我不知道这个图书馆里有什么,但它应该存在。按照目前的情况,您也不能使用 CBC 或任何类似的模式,因为您将每 100 字节而不是一次写入 IV,并且不会将最后一个块链接在相邻的 100 字节块之间。
  3. 如果你想使用 Crypt,为什么不立即将文件加载到内存中呢?我意识到这不会扩展到千兆字节的数据,但在您的正常用例中可能是可能的。或者至少选择一个更大的数据大小,例如256k。然而,如果你超过一个街区,你仍然会面临重复的钥匙设置/损坏的 CBC。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 中使用 OpenSSL 加密和解密文件 的相关文章

随机推荐

  • Python函数的参数长度? [复制]

    这个问题在这里已经有答案了 可能的重复 如何找出Python中方法的数量 https stackoverflow com questions 990016 how to find out the arity of a method in p
  • RabbitMQ:如何在标头交换中使用复杂表达式?

    下面是死信队列中消息的标头 我正在使用 RabbitMQ TypeId com example queue TesteDTO correlationId dfbc9457 8de6 9b77 b7ad b259d1e2ede4 sequen
  • Google SignInButton 的 onClick 无法使用数据绑定

    当我尝试设置onClick我的 Google 中的方法SignInButton android onClick gt viewModel onGoogleLoginClick 我总是收到这个错误 发现数据绑定错误 数据绑定错误 msg 找不
  • 如何从 NSDate 中找到一周的开始?

    我正在实现一个日历视图 我希望它从包含特定日期的一周开始开始 例如 如果目标日期是 2016 年 2 月 29 日星期一 并且当前日历设置为从星期日开始 我希望我的视图从 2 月 28 日星期日开始 这看起来应该很简单 let calend
  • ASP.NET Web API 中的多个 PUT 方法

    我有一个控制器Groups通过以下行动 public GroupModel Get int ID public GroupModel Post CreateGroupModel model public void Put PublicUpd
  • 如何处理 asp.net 3.0 应用程序中 CustomAutorize 属性中的错误

    我正在开发一个 asp net MVC 3 0 应用程序 我正在使用我自己的 CustomRoleProvider 和 CustomErrorHandler 通过覆盖默认属性 一切都运转良好 但是 问题出在异常处理上 在测试应用程序时 测试
  • 未经授权访问 Google 日历 API 发布请求

    我正在尝试在 Meteor 中使用 Google 日历 REST API 我可以使用任何 GET 方法 没有任何问题 但是当我尝试在日历中创建事件时 出现未经授权的访问错误 我根据以下要点得到了我的代码code https gist git
  • 应用程序无法与 VS 2008 SP1 DLL 一起运行,以前的版本适用于 RTM 版本

    自从我们从 Visual Studio 6 切换到 Visual Studio 2008 以来 我们一直在私有并行配置中使用 MFC90 dll 和 msvc pr 90 dll 以及清单文件 这样就不用担心版本问题或将它们安装到系统中 在
  • “裸”git 存储库:如何让 Apache 始终“看到”最新提交?

    我们在服务器上有一个 裸 git 存储库 用于 Web 门户项目 多名程序员 设计师等 执行数十项工作push and pull从 到它 现在我们想要在服务器本身上测试该项目 并始终通过 Apache Web 服务器测试最后一次提交 该服务
  • 让 UISearchBar 像音乐应用程序一样关闭

    请注意如何searchBar放大镜和占位符文本都会在解雇时移动 有什么方法可以在不移动文本和图标的情况下关闭此搜索栏吗 请参阅音乐应用程序的动画 了解我想要实现的动画 我有一个UISeachBar单击导航栏中的搜索按钮时会显示该内容 IBA
  • 如何启动 64 位 PowerShell 进程,无论是从 32 位进程还是 64 位进程启动?

    我需要能够启动 64 位版本的 PowerShell exe 我通过检查 system intptr size 的值是否为 8 来验证我是否处于 64 位版本 要启动 64 位版本的 PowerShell 从 32 位进程中 使用路径 c
  • 什么是区块链和以太坊?它用在哪里?

    我刚刚有机会在基于区块链的以太坊平台上工作 但我不清楚它在哪些场景中使用 在现实生活中使用它 有人可以帮助我了解基于区块链的平台及其现实生活中的用途吗 欢迎来到区块链世界 不要灰心丧气 区块链领域相对较新 很难找到好的教程 我一个月前也开始
  • C++ 阶乘程序中的递归

    你好 我有这段代码是根据其他一些递归和阶乘程序编写的 但我的问题是我真的很困惑它如何存储值并保留它然后最后返回它 int factorialfinder int x if x 1 return 1 else return x factori
  • 网格中的 Tkinter 按钮对齐

    我试图在框架内的网格上安装两个按钮 无论根框架的大小如何 它们都会占据整行 因此 基本上一个按钮占据该行的一半 而另一个按钮占据另一半 这是我的代码 self button frame tk Frame self self button f
  • 如何显示带有 opengl 纹理的灰度图像

    我正在尝试创建一个要显示的纹理 我有 wxh 数组 其中每个像素是 1 个字节 我看过我可以通过 OpenGL glTexImage2D 函数使用灰度图像吗 https stackoverflow com questions 680125
  • 使用 TCP 流并将其重定向到另一个接收器(使用 Akka Streams)

    我尝试使用 Akka 2 4 3 将 TCP 流重定向 转发到另一个接收器 该程序应该打开一个服务器套接字 侦听传入连接 然后使用 tcp 流 我们的发件人不期望 接受我们的回复 因此我们从不发回任何内容 我们只是消耗流 在对 tcp 流进
  • 如何在 Selenium 中使用 EXTJS 生成的 ext-gen ID?

    在测试自动化 Web 应用程序时 我获得了动态生成的 ext gen ID 我尝试使用 xpath 但测试用例失败 我浏览了不同的网站 但没有找到任何运气 有人可以帮助我吗 谢谢你 斯里尼瓦萨马拉地语 对于自动化测试 最好完全避免使用 Ex
  • 无法将 Rhino Mocks 3.5 添加到 Visual Studio 2010 中的 .NET 2.0 项目

    我们正在从 Dev Studio 2005 升级到 Dev Studio 2010 我在 Visual Studio 2010 中打开了 2005 解决方案 并完成了转换过程 使所有项目都以 NET 2 0 为目标 当我尝试构建项目时 我对
  • 模型、视图和控制器是如何连接的?

    我了解模型 视图和控制器在应用程序中扮演的不同角色 但它们如何相互链接 例如 一个简单的比较是 当将 JavaScript 文件与 HTML 文件链接时 需要一个带有 src 引用的标签 自从学习 Rails 以来 我一直被告知它们是相互关
  • 在 .NET 中使用 OpenSSL 加密和解密文件

    我在 C 项目中使用 OpenSSL Crypto 库来加密 解密文件 这是我的代码 byte key System Text Encoding ASCII GetBytes password byte iv System Text Enc