易语言 MD5 数据摘要模块
本帖最后由 爱飞的猫 于 2024-3-26 10:27 编辑虽然说 MD5 已经是一个「不能说是非常安全」的哈希数据摘要算法了,但国内很多地方还在用的样子。
参考了下述实现并魔改到易语言内联汇编([魔改教程](https://www.52pojie.cn/thread-1840664-1-1.html)):
- https://opensource.apple.com/source/ppp/ppp-37/ppp/pppd/md5.c.auto.html
- https://github.com/Zunawe/md5-c/blob/f3529b6/md5.c
提供了面向对象的「`MD5数据摘要`」类,可以免除手动管理内存地址;也提供了高级接口「`数据校验_MD5_*`」来根据自己需要手动调用过程。另外也提供了「`取数据MD5`」、「`取文本数据MD5`」、「`取指针数据MD5`」这三个简单的方法。
注意:这些公开方法返回均为 16 字节长度的「字节集」类型。如果需要十六进制文本,目前只在「`MD5数据摘要::完成_十六进制`」提供;其它函数的返回值需要使用者自行想办法转换。
```text
易语言 MD5 数据摘要算法模块
~~~~~~~~~~~~~~~~~~~~~~~~~~~
版本:
v2024.0213.01
说明:
AES 实现基于下属实现魔改:
- https://opensource.apple.com/source/ppp/ppp-37/ppp/pppd/md5.c.auto.html
- https://github.com/Zunawe/md5-c/blob/f3529b6/md5.c
只依赖核心支持库。
测试于 易语言 5.1,理论上兼容后续版本的易语言。
文件清单:
- e-MD5.ec 编译好的 MD5 数据摘要算法模块。
- demo-MD5.e 示例程序,演示了如何进行大文件的 MD5 计算。
- DEMO 截图.png可执行文件运行截图。
- 说明.txt 你正在阅读的这个文档。
- md5-cxx.zip 该压缩文件包含魔改后的对应 C++ 代码文件,
应使用 i686-w64-mingw32-g++ 编译。
更新记录:
- 20240326 - 修正 DEMO 程序中的文件尺寸转易读形式错误的问题。
- 20240213 - 初版发布
碎碎念:
胶水写起来可真麻烦…
爱飞的猫
于 2024 春
```
-
- [百度网盘存档](https://pan.baidu.com/s/1mRPmJYo39plTlV-ru2nUyw?pwd=wiu7)
压缩包内的 DEMO 程序是一个比较基础的演示程序,用于展示如何利用文件系统的接口以及模块来分段计算 MD5 数据摘要:
第二页是模块的导出信息,比较长就分开放了。
模块名称:汇编 MD5 数据摘要
作者:爱飞的猫
版本:1.0
提供面向对象及过程的 MD5 数据摘要计算方法,不依赖系统哈希接口。
------------------------------
.版本 2
.子程序 取数据MD5, 字节集, 公开, 返回一段文本数据的 MD5 数据摘要编码文本。在常见情况下,不同数据的 MD5 都不一致,因此本命令可以用作保证数据不被篡改。
.参数 数据, 字节集, 参考
.子程序 取文本数据MD5, 字节集, 公开, 返回一段文本数据的 MD5 数据摘要编码文本。在常见情况下,不同数据的 MD5 都不一致,因此本命令可以用作保证数据不被篡改。
.参数 文本数据, 文本型
.子程序 取指针数据MD5, 字节集, 公开, 返回数据的 MD5 数据摘要编码文本。在常见情况下,不同数据的 MD5 都不一致,因此本命令可以用作保证数据不被篡改。
.参数 数据指针, 整数型
.参数 数据尺寸, 整数型
.子程序 数据校验_MD5_初始化, , 公开, [高级] 对新建的操作句柄进行初始化操作。
.参数 操作句柄, 整数型
.子程序 数据校验_MD5_更新, , 公开, [高级] 提交数据,更新 MD5 数据摘要。
.参数 操作句柄, 整数型
.参数 数据地址, 整数型
.参数 数据尺寸, 整数型
.子程序 数据校验_MD5_释放, , 公开, [高级] 结束 [数据校验_MD5_*] 系列函数操作后,需要调用该函数进行资源释放。
.参数 操作句柄, 整数型
.子程序 数据校验_MD5_完成, 字节集, 公开, [高级] 结束更新数据,并返回当前处理的数据的 MD5 数据摘要。
.参数 操作句柄, 整数型
.子程序 数据校验_MD5_新建, 整数型, 公开
.程序集 MD5数据摘要, , 公开
.子程序 更新_数据指针, , 公开
.参数 数据指针, 整数型
.参数 数据尺寸, 整数型
.子程序 更新_字符串, , 公开
.参数 数据, 文本型
.子程序 更新_字节集, , 公开
.参数 数据, 字节集
.子程序 完成, 字节集, 公开, 结束 MD5 计算,并获取对应的 MD5 数据摘要。
.子程序 完成_十六进制, 文本型, 公开, 结束 MD5 计算,并获取对应的 MD5 数据摘要。
.参数 使用大写, 逻辑型, 可空, 默认为 [假],小写。
.参数 添加空格, 逻辑型, 可空, 默认为 [假],不添加空格。
20230713G001133 发表于 2024-3-25 21:14
为什么我传一个5206976680字节的文件显示 869M(应该是4.84 GB)
已修正。加了个专门的函数来显示预估大小:
```
.版本 2
.子程序 文件尺寸到易读尺寸, 文本型
.参数 字节数, 长整数型, , 字节数量
.局部变量 单位列表, 文本型, 静态, "0"
.局部变量 单位序号, 整数型
.局部变量 临时结果, 双精度小数型
.如果真 (取数组成员数 (单位列表) = 0)
单位列表 = { “KiB”, “MiB”, “GiB”, “TiB”, “PiB”, “EiB”, “ZiB” }
.如果真结束
临时结果 = 到数值 (字节数)
.判断循环首 (临时结果 ≥ 1024)
临时结果 = 临时结果 ÷ 1024
单位序号 = 单位序号 + 1
.判断循环尾 ()
.如果真 (单位序号 = 0 或 单位序号 > 取数组成员数 (单位列表))
返回 (到文本 (字节数) + “ 字节”)
.如果真结束
返回 (数值到格式文本 (临时结果, 2, 假) + “ ” + 单位列表 [单位序号])
```
没想到易语言的右移操作竟然不支持长整数型,白调用 API 获取文件大小了。还好读取文件是基于“是否读完”来检查的。 爱飞的猫 发表于 2024-3-26 10:29
能不能直接这样写??
```
.版本 2
.支持库 spec
.子程序 _启动子程序, 文本型, , 本子程序在程序启动后最先执行
.局部变量 a, 文本型
a = 到文本 (5206976680 ÷ 1024 ÷ 1024 ÷ 1024)
返回 (取文本左边 (a, 寻找文本 (a, “.”, 1, 假) + 2))
``` 数据很庞大,现在CMD5密码用的太多了 我一直想着做个入门学习,奈何易语言我就是玩不明白,哭 wyesheng 发表于 2024-2-13 16:20
我一直想着做个入门学习,奈何易语言我就是玩不明白,哭
可以学别的 脚本语言可能没有中文,但有中文教程和更多人用,也更容易上手 爱飞的猫 发表于 2024-2-14 22:34
可以学别的 脚本语言可能没有中文,但有中文教程和更多人用,也更容易上手
求指导,学哪个好点咯? 还行,算是挺快的,就是不知道稳定性怎么样,还没测试,比我现在用的快。10g文件耗时96秒,我用的117秒。py耗时157。node耗时224。 谢谢分享 本帖最后由 20230713G001133 于 2024-3-25 21:17 编辑
为什么我传一个5206976680字节的文件显示 869M(应该是4.84 GB)
20230713G001133 发表于 2024-3-25 21:14
为什么我传一个5206976680字节的文件显示 869M(应该是4.84 GB)
超过 4G 范围,文件大小未正常处理。我晚点更新下。