- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试修改的一款旧游戏具有 CRC-32 校验。我无权访问 CRC 校验和本身,因此我必须修改文件,同时保持相同的校验和输出。
我的信息
文件,如果文件本身是CRC-32程序的唯一输入,我可以计算出CRC-32校验和应该是多少。
32 位多项式代码。
最佳答案
正如@MrSmith42 所说,只要您不需要保持文件长度不变,就可以轻松计算出“冲突”(为产生相同散列的两个输入消息指定的名称)。
它很繁琐,有很多小 Action ,但速度非常快。
假设原始文件是,十六进制:
1122334455667788
然后它的 CRC-32 校验和将是 0x9118E1C2
使用标准 CRC32 多项式。如果使用的算法不标准,可以替换。出于演示目的,我将坚持使用标准。
首先,根据需要更改文件。例如,我改变了中间的一个字节:
11223344FF667788
恢复 CRC 的第一步是用 4 个零字节填充文件:
11223344FF66778800000000
CRC 校验和现在是 0x6BBE83C9
。
第二步,异或两个校验和:
0x9118E1C2 XOR 0x6BBE83C9 = 0xFAA6620B
第三步,对结果进行位反转:
Bit reverse of 0xFAA6620B = 0xD046655F
第四步,这有点古怪,所以请看下面,执行反向 CRC32 计算:
0xD046655F * inverse(x32) mod crc_poly = 0xe4c7d232
第五步,对结果进行位反转,这次是按字节:
0xe4c7d232 bit reversed byte-wise = 0x27E34B4C
第六步,用结果替换填充的字节
11223344FF66778827E34B4C
瞧,CRC32 校验和值现在回到 0x9118E1C2。
据我所知,执行反向 CRC 计算的最简单方法是使用 Python 中的 BitVector 包:
>>> import BitVector as bv
>>> poly = bv.BitVector(intVal = 0x104C11DB7) # "standard" CRC32 polynomial
>>> inv = bv.BitVector(intVal = 0x100000000).gf_MI(poly, 32)
>>> k = 0xD046655F
>>> p = bv.BitVector(intVal = k).gf_multiply_modular(inv, poly, 32)
>>> print(p.getHexStringFromBitVector())
e4c7d232
此算法由 Redditor/u/supersaw7 发表于 this thread .我还没有遇到更好的版本,尽管可能有更简单的版本。
关于algorithm - 如何在保持 CRC-32 校验和的同时修改文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247647/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!