27软件安完整性CRC32自校验生成端

CRC32算法概述

CRC全称Cyclic Redundancy Check,又叫循环冗余校验。CRC32跟md5,sha1一样都是哈希算法的一种。crc32的优势是速度快,它被设计的目的是用来检测数据在网络传输过程中可能出现的随机错误。它跟md5和sha1有本质的区别就是它不是一种加密hash算法或者叫not cryptographically secure或者not cryptographic hashing。加密哈希算法的特征比如空间极大,碰撞概率极低,对于给定的哈希值难以找到另一个哈希值相同的字符串等crc32都不具备。

CRC32算法原理
前面说到crc32的一些特性,这个要从crc32的原理开始分析。crc32的数学原理看起来还是有点复杂的,我也理解不透彻。简单一点理解就是把需要进行校验的数据选定一个除数进行一次除法运算,称为模2除法,跟通常二进制除法规则不同,得到的余数作为循环冗余码。数据接收端接收到数据之后进行同样的运算,即可判断数据在传输过程中是否出现了变化。当然具体的计算方式会复杂的多。这里说的不当的地方或者有更好的表达方式欢迎讨论。

计算的CRC32的起始位置是PE文件头开始处,结束位置在整个文件的尾部.

CRC32自校验生成端示意图:

511遇见

CRC32自校验生成端源码

.版本 2
.支持库 edroptarget
 
.程序集 窗口程序集_启动窗口
 
.子程序 __启动窗口_创建完毕
 
拖放对象1.注册拖放控件 (_启动窗口.取窗口句柄 ())
 
.子程序 校验_取crc32, 整数型, 公开, 用于取crc32,结果为16进制文本
.参数 字节集数据, 字节集, , 要取CRC32数据字节集
.局部变量 crcval, 整数型
.局部变量 长度, 整数型
.局部变量 i, 整数型
.局部变量 结果, 整数型
.局部变量 位置, 整数型
.局部变量 crc, 整数型
.局部变量 局_table, 整数型, , "256"
 
长度 = 取字节集长度 (字节集数据)
.如果真 (长度 < 1)
    返回 (0)
.如果真结束
.变量循环首 (0, 255, 1, i)  ' 用来得到码表
    crc = i
    .变量循环首 (1, 8, 1, )
        .如果 (位与 (crc, 1) ≠ 0)
            crc = 位异或 (位与 (右移 (crc, 1), 2147483647), 3988292384)  ' crc xor EDB88320
        .否则
            crc = 位与 (右移 (crc, 1), 2147483647)
        .如果结束
 
    .变量循环尾 ()
    局_table [i + 1] = crc
.变量循环尾 ()
crcval = 4294967295
.计次循环首 (长度, i)
    位置 = 位异或 (字节集数据 [i], 位与 (crcval, 255)) + 1  ' 查表
    crcval = 位异或 (位与 (右移 (crcval, 8), 16777215), 局_table [位置])
.计次循环尾 ()
结果 = 位取反 (crcval)
返回 (结果)
 
.子程序 _按钮1_被单击
.局部变量 原EXE字节集, 字节集
.局部变量 原EXE字节集长度, 整数型
.局部变量 PE起始位置, 整数型
.局部变量 PE后字节集, 字节集
.局部变量 需要写入的CRC32整数, 整数型
.局部变量 需要写入的CRC32字节集, 字节集
.局部变量 信息框文本CRC32字节集, 文本型
.局部变量 生成的EXE, 字节集
 
原EXE字节集 = 读入文件 (编辑框1.内容)
原EXE字节集长度 = 取字节集长度 (原EXE字节集)
PE起始位置 = 寻找字节集 (原EXE字节集, { 80, 69 }, )
PE后字节集 = 取字节集中间 (原EXE字节集, PE起始位置, 原EXE字节集长度)
需要写入的CRC32整数 = 校验_取crc32 (PE后字节集)
信息框文本CRC32字节集 = 取十六进制文本 (需要写入的CRC32整数)
需要写入的CRC32字节集 = 到字节集 (需要写入的CRC32整数)
生成的EXE = 取字节集左边 (原EXE字节集, PE起始位置 - 5) + 需要写入的CRC32字节集 + PE后字节集
.判断开始 (信息框 (“CRC32: ” + 信息框文本CRC32字节集 + #换行符 + #换行符 + “是否将CRC32 写入到 EXE”, #是否钮, , ) = 5)
    .判断开始 (写到文件 (编辑框1.内容, 生成的EXE))
        信息框 (“CRC32写入成功!”, 0, , )
 
    .默认
        信息框 (“CRC32写入失败!”, 0, , )
    .判断结束
 
.默认
 
.判断结束


发布日期:

所属分类: 易语言 标签: