将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

2024-03-25

我正在将我从自己的类中定义的一些对象保存到文件中。 (保存流数据)。

这一切都很好,但我希望能够在文件中存储该文件的 CRC 校验和。

然后,每当我的应用程序尝试打开文件时,它都可以读取内部存储的 CRC 值。

然后对实际文件进行检查,如果文件的 CRC 与内部存储的 CRC 值匹配,我可以正常处理该文件,否则显示一条错误消息,表明该文件无效。

我需要一些关于如何做到这一点的建议,我想我可以做这样的事情:

  • 从我的应用程序保存文件。
  • 计算保存文件的 CRC。
  • 编辑存储 CRC 值的已保存文件。
  • 每当打开文件时,检查 CRC 是否与内部 CRC 值匹配。

问题是,一旦文件中的单个数据字节发生更改,就会导致 CRC 校验和与预期完全不同。


我通常更喜欢将 CRC 排除在检查之外的方法。但如果由于某种原因无法做到这一点,有一个解决方法:

需要预留8个字节,其中4个用于CRC,4个用于补偿数据。首先用某个虚拟值填充保留字节(例如0x00)。然后计算前 4 个字节的 CRC,最后更改其他 4 个字节,使文件的 CRC 保持不变。

有关如何执行此计算的详细信息:反转 CRC32 https://stackoverflow.com/questions/1514040/reversing-crc32


我实际上用过这个我的项目之一 https://github.com/CodesInChaos/Go-Audio-Lesson-Tool:

我正在设计一种基于 zip 的文件格式。存档中的第一个文件未压缩存储并用作头文件。这也意味着它存储在文件中的固定偏移量处。到目前为止相当标准,类似于 ePub。

现在我决定在标头中包含 sha1 哈希,为每个文件提供一个基于内容的唯一 ID 并进行完整性检查。由于标头和 sha1 哈希值位于文件中已知的偏移量,因此在哈希值很简单时将其屏蔽。因此,我输入一个虚拟哈希并创建 zip 文件,然后对文件进行哈希并填写真实哈希。

但现在有一个问题:Zip 存储了所有包含的文件的 CRC。不仅在 sha1 散列时很容易屏蔽的一个地方,而且在文件末尾附近具有可变偏移量的第二个地方。所以我决定使用 CRC 伪造,这样我就得到了强哈希,并且 zip 得到了有效的 CRC32。

由于我已经为最终文件伪造了 CRC,因此我决定为原始头文件伪造它也不会造成伤害。因此,这种格式的所有文件现在都以具有 CRC 的头文件开头0xD1CE0DD5.

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

将 CRC 值保存在文件中,而不更改实际的 CRC 校验和? 的相关文章

  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • Delphi错误数据集未处于插入或编辑模式

    客观的 单击 TRxDBCombo 上的按钮调用搜索框 从搜索框中选择记录时 结果将设置为 TComboEditBox 的字段值 并发布在 TRxMemoryData 数据集中 错误 第二次调用此函数时出现数据集未处于插入或编辑模式 TDB
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • 如何更新Delphi对象检查器?

    继我最近发布的这个问题之后 组件编辑器可以在多个组件上执行吗 https stackoverflow com questions 14802371 can a component editor be executed on multiple
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • Delphi (Indy) TIdTCPClient 在线程中

    在互联网上 我看到通常将 TIdTCPClient 放置在自定义 TThread 后代中 为什么要这样做 有时我也在这样的线程中看到服务器 为什么 干杯 阿德里安 Indy 使用阻塞 I O 最好在线程中处理 这是 Indy 整体设计的核心
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

    我编写了一个应用程序 该应用程序具有覆盖类型的窗口 可以通过热键显示和隐藏该窗口 而另一个应用程序具有焦点 所述另一个应用程序是一个以管理员权限运行的 DirectX 游戏 我已经尝试了 3 种可能的解决方案 以便在其他应用程序中按下我的热
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在Delphi XE中通过名称获取类类型引用?

    我实际上正在尝试使用 Rtti 来实现通用方法调用程序 它应该像这样工作 我将提供类名 方法名和参数 调用者将通过调用此类的指定方法来完成其工作 因此 我需要类引用才能获取其 Rtti 信息并寻找我想要调用的方法 有没有办法在不实现我想要使
  • 如何确保 FormClose 程序运行,无论程序如何退出?

    在 Delphi 7 中 我有一个 TMainForm FormClose 过程 旨在在程序退出时写出一些状态 这在手动关闭程序时效果很好 但是 我发现如果程序被 Windows 强制 退出 例如在 Windows 更新后需要重新启动 则不
  • 如何检测已更改的网页?

    在我的应用程序中 我使用 LWP 定期获取网页 无论如何 是否要检查两次连续提取之间网页是否在某些方面发生了变化 除了明确进行比较之外 是否有在较低协议层生成的任何签名 例如 CRC 可以提取并与旧签名进行比较以查看可能的更改 有两种可能的
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • 为什么未初始化的指针会导致内存访问冲突接近 0?

    据说often 但并非总是如此 当你在接近于零的内存位置 比如 89 美元 获得 AV 时 你就有了一个未初始化的指针 但我也在 Delphi 书籍中看到了这一点 嗯 或者它们都是由同一作者写的 Update 引自 Bob Swart 等人
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时

随机推荐

  • 依赖项的 Maven 项目变量

    我有一个加载小程序的 html 文件 html需要通过名称引用jar 并且由于maven根据artifactid 版本等对其进行命名 因此html需要随着项目的发展动态更新 似乎资源过滤是可行的方法 但我无法弄清楚要插入的变量应该是什么样子
  • jQuery 动画小数递增/递减

    我想一步一步地动画两个十进制数之间的差异 已经发现乔斯 克劳克罗夫特的解决方案 http www josscrowcroft com 2011 code jquery animate increment decrement numeric
  • 数据类中的属性

    描述 我正在尝试实现一个仅包含几个参数的简单数据类 dataclass class ReconstructionParameters img size int CR int denoise bool epochs int learning
  • 如何以可跨 Linux、Windows 和 MacOS 移植的方式收集 Python 3 中的当前架构?

    我正在尝试找到一种可移植的方式来收集当前的架构 例如x86 64 or AArch64 我将用它来填充一个标志 例如is x86 使用Python 3 它看起来像import platform platform machine 函数是正确的
  • 获取 CPU、RAM 和 GPU 信息 - UWP 应用

    是否可以在 UWP 应用程序中获取计算机的 CPU GPU 和 RAM 信息 E 在文本块中显示此信息 我想知道处理器型号 例如 Intel Core i7 xxxx 和总 RAM 我想知道处理器型号 例如 Intel Core i7 xx
  • 启发式参与者永无休止的定期恢复

    几天来我们的日志里一直充斥着这样的消息 2018 06 15 12 19 23 WARN com arjuna ats arjuna Periodic Recovery Transaction 0 ffff0a983f1e 1f3aa2ff
  • IE10 上的 WebSocket 出现 SecurityError

    我目前正在 IE10 在 Windows 8 上 下开发一个网站 使用 JavaScript 中的 WebSockets 它在 Firefox 18 和 Chrome 25 下运行良好 但在 IE10 上建立连接时出现 SecurityEr
  • 如何解决android中的OutOfMemoryError?

    我已经准备了可绘制动画的数量 当应用程序启动时 第一个动画将启动 我有两个按钮 下一个和上一个 具有相同的活动 当我单击下一个按钮时 我遇到了异常 例如 java lang OutOfMemoryError bitmap size exce
  • java中基于表单的身份验证的混乱

    谁能告诉我 我该如何处理j 安全检查java中基于表单的身份验证中的servlet 我是否必须映射 servlet 类j 安全检查web xml 文件中的名称 例如
  • 我如何在 Swift 中投射 @Binding

    很快我就可以用 Int doubleVariable 将 Int 转换为 Double 但是如何将 Binding 转换为 Binding 呢 然后我可以将 Binding var intVar Int 传递给需要 Double 绑定的函数
  • Python 正则表达式模块即使重叠 = True 也找不到所有匹配项

    我正在使用 PyPy正则表达式模块 https pypi org project regex 具有重叠匹配支持 我有以下代码 其中有一个字符串 A 我正在使用正则表达式查找在正则表达式中定义的 DNA 模式 我想找到与我的 RE 的所有匹配
  • RxJs 将流拆分为多个流

    如何根据分组方法将永无止境的流拆分为多个结束的流 a a a a a b b b b c c c c d d d e gt 到这些可观察到的 a a a a a b b b b c c c c d d d e gt 如您所见 a是在开始的时
  • 初始化 selenium webdriver 时如何修复 python-selenium 错误“连接被拒绝”?

    我正在非公共网页上运行非常复杂的 python selenium 测试 在大多数情况下 这些测试运行良好 但有时这些测试之一在 Webdriver 本身的初始化期间会失败 提示 当尝试初始化网络驱动程序时 即执行以下操作时 会发生此错误 S
  • 通过(sails js)水线将值推入mongodb数据库数组

    节点js 帆js 水线 插入后我需要将值更新 或推送 到以下架构中 我将 sailsjs 与 Waterline 和 mongodb 一起使用 countries states statename state districts distn
  • 在 ReleaseMutex 之前 CloseHandle 互斥锁 - 会发生什么?

    如果我在线程完成互斥体之前对互斥体调用 CloseHandle 因此尚未调用 ReleaseMutex 那么预期的行为是什么 CloseHandle 立即销毁传递给它的句柄 ReleaseMutex 然后会失败ERROR INVALID H
  • Kafka新生产者超时

    我正在使用新的 kafka 生产者客户端并将 timeout ms 属性设置为 50 毫秒 这是生产者中使用的完整配置 props put acks 1 props put buffer memory 33554432 props put
  • WCF中不使用CallBack将数据推送到客户端

    是否可以在 WCF 服务中将数据推送到客户端而不使用回调 设想 有 2 个客户端使用服务 客户端1发送消息 然后客户端2收到客户端1发送的消息 解决这个问题有几种方法 Use 发布 订阅框架 http msdn microsoft com
  • 使用 JCrop 裁剪绘制到画布中的图像

    我是 HTML5 新手 正在尝试使用 JCrop 裁剪图像 如果我想直接裁剪它是没有问题的 但是当它被绘制到画布中时 JCrop 不起作用 我认为原因可能是我正在创建一个图像变量 以便能够将其绘制到视口画布中并动态设置它的 Id 所以 Jq
  • 无法转换 java.util.Arraylist 类型的对象 从 Firebase 实时数据库嵌套对象读取

    此 Firebase 数据库结构 在此输入图像描述 https i stack imgur com sIjX8 png 这是我的设备类别 public class Device private String title private Ma
  • 将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

    我正在将我从自己的类中定义的一些对象保存到文件中 保存流数据 这一切都很好 但我希望能够在文件中存储该文件的 CRC 校验和 然后 每当我的应用程序尝试打开文件时 它都可以读取内部存储的 CRC 值 然后对实际文件进行检查 如果文件的 CR