爱飞的猫 发表于 2023-10-4 06:27

AES 加解密模块 [v1.1-2023.1010-R01]

本帖最后由 爱飞的猫 于 2023-10-10 09:18 编辑


支持的 AES 模式:`AES-{128,192,256}-{ECB,CBC,CTR}`,共 9 种。

不使用系统自带的 `wincrypt` 接口,其中软件实现移植(编译)自 tiny-AES-c 代码,用到 AES-NI 指令集的代码则是移植自英特尔的 AES-NI 指令集白皮书。

内置了个 DEMO 实例程序来调用里面的接口,可以参考里面的代码来使用。

同时提供了高阶用法的接口,即通过 AES 操作句柄来进行操作。

```
易语言 AES 加解密支持模块
~~~~~~~~~~~~~~~~~~~~~~~~~

版本:

          v1.1_2023.1010-R01

说明:

    AES 软件实现基于 kokke/tiny-AES-c,进行了一些魔改。
    AES-NI 实现基于英特尔公开的 AES 指令集白皮书修改而来。
    模块本体只依赖核心支持库,无需第三方支持库即可运行。

    从源码运行或编译[示例程序]需要安装有[黑月编译环境]。
    测试于 易语言 5.1 与 易语言 5.93,稳定运行。
    只使用 AES 模块不需要[黑月编译环境]。

文件清单:

          - aes.ec            编译好的 AES 加解密模块。
          - AES_DEMO.e      示例程序,正确编译需要[黑月编译环境]支持。
          - AES_DEMO.rc       黑月编译器的资源文件
          - aes_demo.exe      使用黑月编译器编译后的示例程序。
          - res/            该目录包含示例程序的资源文件。
          - 截图.png          示例程序的运行截图。
          - 说明.txt          你正在阅读的这个文档。
          - 模块_aes_测试.e   开发阶段用来测试 AES 准确性的代码。
          - tiny-AES-c.zip    该压缩文件包含 v1.0 时魔改的 tiny-AES-c 代码。
                              原始代码来自 https://github.com/kokke/tiny-AES-c/
                              虽然授权协议不要求公开修改后的代码,但还是附上好了。
                              使用 i686-w64-mingw32-g++ 编译即可。
                              新版本换汤不换药,只稍微改了下接口,就不提供了。
          - checksums.sha512该压缩包内所有文件的校验信息。

更新记录:

    v1.1-2023.1010-R01 更新了接口:

      - 现在在初始化阶段指定加密或解密方案。
      - 旧的 与 方法/函数均替换为 [处理数据]。

    v1.0-2023.1003-R01 初版发布,没有什么好说的。

碎碎念:

    胶水写起来可真麻烦,然后易语言生成的机器码质量也太差了…

    DEMO 代码还附带了两个大部分由汇编组成的 十六进制 和 字节集 互转的代码。

                                                      爱飞的猫
                                                      于 2023 冬
```

※ 执行压缩包内的示例程序不需要黑月环境,编译源码需要。





---

完美兼容 易语言 5.93:





第二页是模块导出信息,有兴趣可以看看设计的接口。


模块名称:AES 加解密
作者:爱飞的猫 @52pojie
版本:1.1

基本的 AES 加解密方法
@备注:
软件回退模式基于 tiny-c-aes。
AES-NI 代码参考自英特尔 AES 加速指令集白皮书。

------------------------------

.版本 2

.子程序 AES_初始化, 整数型, 公开, [底层接口] 建立一个新的 AES 实例。若使用 CBC/CTR 模式则需要后续通过 指定。成功返回操作句柄,出错返回 0。
.参数 加解密模式, 整数型, , 初始化时指定加解密的模式,后续调用 进行加密或解密操作。
.参数 强制使用软件实现, 逻辑型, , 若设置为 [真],则强制使用软件实现;否则将检测 AES 指令集是否可用并启用。建议设定为 [假]。
.参数 密钥指针, 整数型
.参数 密钥长度, 整数型, , 使用 [#AES_密钥长度_128、#AES_密钥长度_192、#AES_密钥长度_256] 中的一个。

.子程序 AES_处理数据, , 公开, [底层接口] 根据 指定的模式对缓冲区的数据进行加密或解密操作。
.参数 操作句柄, 整数型, , 通过 获取的句柄。
.参数 缓冲区地址, 整数型, , 建议使用对其到 0x10 的指针区域,可能会对性能有一定的优化。
.参数 缓冲区长度, 整数型, , 缓冲区指向的长度需等于块长度的倍数;数据长度由调用者检查。错误的缓冲区长度可能会导致加解密的结果错误。

.子程序 AES_取IV, , 公开, 获取当前的 IV 值。
.参数 操作句柄, 整数型, , 通过 获取的一个句柄。
.参数 指针_IV, 整数型, , 长度需为 [#AES_IV长度]

.子程序 AES_取是否启用加速指令集, 逻辑型, 公开, 检查实例化后的 AES 句柄是否启用了 AES 加速指令集。
.参数 操作句柄, 整数型, , 通过 获取的一个句柄。

.子程序 AES_销毁, , 公开
.参数 操作句柄, 整数型, , 通过 获取的一个句柄。

.子程序 AES_置IV, , 公开, CBC 与 CRT 模式需要指定 IV。
.参数 操作句柄, 整数型, , 通过 获取的一个句柄。
.参数 指针_IV, 整数型, , 长度需为 [#AES_IV长度]

.子程序 PKCS7_计算填充长度, 整数型, 公开, 获取手动填充的长度 [记为 n];之后填充 n 个字节内容为 n 的内容到原始内容结尾。
.参数 实际大小, 整数型
.参数 块大小, 整数型

.子程序 PKCS7_取原始内容, 字节集, 公开, 失败返回去除填充的内容,错误返回空字节集。
.参数 原始内容, 字节集, 参考
.参数 块大小, 整数型
.参数 错误码, 整数型, 参考 可空, 错误描述参考 [#PKCS7_错误_*] 常数。

.子程序 PKCS7_取原始内容长度, 整数型, 公开, 成功返回截取长度,错误返回负数。错误描述参考 [#PKCS7_错误_*] 常数。
.参数 原始内容, 字节集, 参考, 需要去除填充的内容
.参数 块大小, 整数型

.子程序 PKCS7_填充, 字节集, 公开, 使用 PKCS7 算法对数据进行填充。
.参数 原始内容, 字节集
.参数 块大小, 整数型

.程序集 AES, , 公开

.子程序 初始化, 逻辑型, 公开, 初始化当前 AES 加解密实例。
.参数 加解密模式, 整数型, , 初始化时指定加解密的模式,后续调用 进行加密或解密操作。
.参数 强制使用软件实现, 逻辑型, 可空, 若设置为 [真],则强制使用软件实现;否则将检测 AES 指令集是否可用并启用。建议设定为 [假]。默认为 [假]。
.参数 密钥, 字节集, , 请确保长度为 [#AES_密钥长度_128、#AES_密钥长度_256、#AES_密钥长度_256] 之一。
.参数 IV, 字节集, 可空, 初始化向量,CBC/CTR 模式需要,若不指定则为默认的 00。不建议复用同一 IV,应当在需要时随机生成。长度应等于 [#AES_IV长度]。

.子程序 处理数据, 逻辑型, 公开, 根据 [初始化] 指定的模式对缓冲区的数据进行加密或解密操作。
.参数 缓冲区, 字节集, 参考, 长度需等于密钥的长度的倍数。推荐使用 填充方法。

.子程序 高级_取AES句柄, 整数型, 公开, [高阶方法] 取出可用于 函数的操作句柄。取出后请不要调用释放。类变量离开作用域时将会自动销毁,届时使用句柄将会导致程序崩溃或出错。失败或尚未初始化返回 0。

.子程序 高级_释放, 整数型, 公开, [高阶方法] 释放后将不会主动销毁,该类的其它方法也将不会成功。释放成功后取出可用于 函数的操作句柄。失败或尚未初始化返回 0。

.子程序 高级_置AES句柄, , 公开, [高阶方法] 若已初始化,则将销毁当前类已初始化的 AES 内容。随后置入其它方法初始化后得到的 AES 句柄。
.参数 AES操作句柄, 整数型

.子程序 取IV, 字节集, 公开, 取下次计算时使用的 IV 值。

.子程序 置IV, 逻辑型, 公开, 为需要 IV 的算法指定 IV 值,目前仅限 CBC 与 CTR 模式需要。
.参数 IV, 字节集, , 新的 IV 值,长度应等于 [#AES_IV长度]。

.子程序 主动销毁, , 公开, 释放内存。

.常量 AES_IV长度, "16", 公开, IV (初始化向量) 数据的大小,单位为字节。
.常量 AES_块大小, "16", 公开, 数据块的大小,单位为字节
.常量 AES_密钥长度_128, "16", 公开
.常量 AES_密钥长度_192, "24", 公开
.常量 AES_密钥长度_256, "32", 公开
.常量 AES_模式_CBC_加密, "3", 公开
.常量 AES_模式_CBC_解密, "4", 公开
.常量 AES_模式_CTR_加密, "5", 公开
.常量 AES_模式_CTR_解密, "6", 公开, 注意 CTR 解密调用的解密和加密本质上是同一个接口。
.常量 AES_模式_ECB_加密, "1", 公开
.常量 AES_模式_ECB_解密, "2", 公开
.常量 PKCS7_错误_数据块太小, "-1", 公开, [数据大小] 比 [块大小] 更小。
.常量 PKCS7_错误_填充值太小, "-2", 公开, 填充 (padding) 值比 [块大小] 更小。
.常量 PKCS7_错误_校验失败, "-3", 公开, 填充 (padding) 值校验错误。

爱飞的猫 发表于 2023-10-4 16:41

本帖最后由 爱飞的猫 于 2023-10-4 16:44 编辑

chboy 发表于 2023-10-4 16:32
您说的是这个吗?
应该是同一个东西

在 manifest 添加 hidpi 支持可以看这个
https://learn.microsoft.com/en-u ... eness-for-a-process

也可以主动调用 API 让系统知道,但是要判断系统里的这个函数是否存在(如果需要支持 xp)
这部分的说明在上文的 Setting default awareness programmatically 章里。

修正字体的话,就是获取系统默认字体,然后一个一个应用上去。
这部分参考初始化代码和对 EnumChildWindows 接口的使用。

chboy 发表于 2023-10-4 16:43

爱飞的猫 发表于 2023-10-4 16:41
应该是同一个东西

在 manifest 添加 hidpi 支持可以看这个


我很少看到易语言程序还能支持高精度DPI的界面了。

一般都是手动操作可执行文件 都是DPI缩放替代(增强)来优化分辨率。

tl;dr 发表于 2023-10-4 06:39

爱飞的猫 发表于 2023-10-4 06:54

tl;dr 发表于 2023-10-4 06:39
冬天还没到

都十月了,算吧。

tp206555 发表于 2023-10-4 07:24

感谢大佬分享,学习学习

wojinz 发表于 2023-10-4 07:57

大佬,请问黑月环境要怎么安装?

error3 发表于 2023-10-4 08:56

如果有dll文件就更好了

wqq4309593 发表于 2023-10-4 09:12

少年你太天真了!

chboy 发表于 2023-10-4 10:45

说个题外话,一般易语言都不能适配你的高分辨率屏把?我看你的易语言程序截图很清晰。

Xinshao 发表于 2023-10-4 11:15

这个和精易模块的对称加密有什么区别或优点呢?

爱飞的猫 发表于 2023-10-4 15:58

error3 发表于 2023-10-4 08:56
如果有dll文件就更好了

拿 c 代码改改,编译一下就是了
页: [1] 2 3
查看完整版本: AES 加解密模块 [v1.1-2023.1010-R01]