跳转至

通用加解密函数(crypto)

一、加解密概述

加解密算法是保证数据安全的基础技术,无论是在数据传输、存储,还是用户身份验证中,都起着至关重要的作用.随着互联网的发展和信息安全威胁的增加,了解并掌握常用的加解密算法已经成为开发者和安全从业者的必修课.

常见的 15 种加密解密算法分别是:散列哈希[MD5、SHA1、CRC32],对称[DES,3DES(TDEA、Triple DES),AES、,Blowfish,RC4、RC5,IDEA],Base64、Rabbit、Escape.

【三种分类】

1、对称加密:对称加密是指加密和解密使用同一个密钥的加密方法.由于加密和解密过程中的密钥相同,因此需要在通信双方之间安全地共享密钥.对称加密的速度较快,适合用于大量数据的加密

2、非对称加密:非对称加密算法采用一对密钥:公钥和私钥.公钥用于加密,私钥用于解密.由于加密和解密使用不同的密钥,非对称加密算法解决了密钥分发的问题,是当前加密系统中安全性最高的加密技术之一.

3、Hash 算法,这是一种不可逆的算法,它常用于验证数据的完整性

二、演示功能概述

本文章通过 Air201的模组烧录 LuatOS 示例代码(点此链接查看 crypto 的 demo 例子),来演示有关加解密的各种 API 的功能.

API 的具体用法,读者可以参考本文中的"五、API 说明".

三、硬件准备

3.1 Air201 模组

使用 Air201 模组,如下图所示:

点击链接购买:合宙Air201模组淘宝购买链接

此模组的详细使用说明参考:Air201 产品手册

3.2 SIM 卡

中国大陆环境下,可以上网的 sim 卡,一般来说,使用移动,电信,联通的物联网卡或者手机卡都行.

3.3 PC 电脑

请准备一台配备 USB 接口且能够正常上网的电脑。

电脑操作系统为:WIN10以及以上版本的WINDOWS系统。

3.4 数据通信线

带TYPE-C口的USB数据线.

四、软件环境

4.1 Luatools 工具

要想烧录 LuatOS 到 4G 模组中,需要用到合宙的强大的调试工具:Luatools

详细使用说明参考:Luatools 工具使用说明 .

Luatools 工具集具备以下几大核心功能:

  • 一键获取最新固件:自动连接合宙服务器,轻松下载最新的合宙模组固件.
  • 固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中.
  • 串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能.
  • 串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求.

Luatools 下载之后,新建一个命名为 "Luatools" 的文件夹,将下载的Luatools_v3.exe拷贝或移动到新建的Luatools文件夹内,点击 Luatools_v3.exe 即可运行.

4.2 准备需要烧录的代码

首先要说明一点: 脚本代码, 要和固件的 soc 文件一起烧录.

4.2.1 烧录的底层固件文件

底层 core 下载地址:LuatOS 固件版本下载地址 注:本 demo 使用如图所示固件

4.2.2 烧录的脚本代码

首先要下载 Air201 的 LuatOS 示例代码到一个合适的项目目录,示例代码网站: https://gitee.com/openLuat/LuatOS-Air201

下载流程参考下图:

下载的文件解压,找到 LuatOS-Air201-master\demo\crypto\main.lua,如图:

五、API 说明

5.1 crypto.md5(str)

计算 md5 值

参数

传入值类型
解释
string
需要计算的字符串

返回值

返回值类型
解释
string
计算得出的 md5 值的 hex 字符串

例子

-- 计算字符串"abc"的 md5

log.info("md5", crypto.md5("abc"))


5.2 crypto.hmac_md5(str, key)

计算 hmac_md5 值

参数

传入值类型
解释
string
需要计算的字符串
string
密钥

返回值

返回值类型
解释
string
计算得出的 hmac_md5 值的 hex 字符串

例子

-- 计算字符串"abc"的 hmac_md5

log.info("hmac_md5", crypto.hmac_md5("abc", "1234567890"))


5.3 crypto.sha1(str)

计算 sha1 值

参数

传入值类型
解释
string
需要计算的字符串

返回值

返回值类型
解释
string
计算得出的 sha1 值的 hex 字符串

例子

-- 计算字符串"abc"的 sha1

log.info("sha1", crypto.sha1("abc"))


5.4 crypto.hmac_sha1(str, key)

计算 hmac_sha1 值

参数

传入值类型
解释
string
需要计算的字符串
string
密钥

返回值

返回值类型
解释
string
计算得出的 hmac_sha1 值的 hex 字符串

例子

-- 计算字符串"abc"的 hmac_sha1

log.info("hmac_sha1", crypto.hmac_sha1("abc", "1234567890"))


5.5 crypto.sha256(str)

计算 sha256 值

参数

传入值类型
解释
string
需要计算的字符串

返回值

返回值类型
解释
string
计算得出的 sha256 值的 hex 字符串

例子

-- 计算字符串"abc"的 sha256

log.info("sha256", crypto.sha256("abc"))


5.6 crypto.hmac_sha256(str, key)

计算 hmac_sha256 值

参数

传入值类型
解释
string
需要计算的字符串
string
密钥

返回值

返回值类型
解释
string
计算得出的 hmac_sha256 值的 hex 字符串

例子

-- 计算字符串"abc"的 hmac_sha256

log.info("hmac_sha256", crypto.hmac_sha256("abc", "1234567890"))


5.7 crypto.sha512(str)

计算 sha512 值

参数

传入值类型
解释
string
需要计算的字符串

返回值

返回值类型
解释
string
计算得出的 sha512 值的 hex 字符串

例子

-- 计算字符串"abc"的 sha512

log.info("sha512", crypto.sha512("abc"))


5.8 crypto.hmac_sha512(str, key)

计算 hmac_sha512 值

参数

传入值类型
解释
string
需要计算的字符串
string
密钥

返回值

返回值类型
解释
string
计算得出的 hmac_sha512 值的 hex 字符串

例子

-- 计算字符串"abc"的 hmac_sha512

log.info("hmac_sha512", crypto.hmac_sha512("abc", "1234567890"))


5.9 crypto.base64_encode(data)

将数据进行 base64 编码

参数

传入值类型
解释
string
待编码的数据

返回值

返回值类型
解释
string
编码后的数据

例子

-- 本函数与 string.toBase64 是同一个

local data = "123"

local bdata = crypto.base64_encode(data)

log.info("base64", "encode", data, bdata)

data = crypto.base64_decode(data)

log.info("base64", "decode", data, bdata)


5.10 crypto.base64_decode(data)

将数据进行 base64 解码

参数

传入值类型
解释
string
待解码的数据

返回值

返回值类型
解释
string
解码后的数据

例子

-- 本函数与 string.fromBase64 是同一个

local data = "123"

local bdata = crypto.base64_encode(data)

log.info("base64", "encode", data, bdata)

data = crypto.base64_decode(data)

log.info("base64", "decode", data, bdata)


5.11 crypto.cipher_list()

获取当前固件支持的 cipher 列表

参数

返回值

返回值类型
解释
table
本固件支持的 cipher 列表,字符串数组

例子

-- 本 API 于 2022.07.27 添加

local ciphers = crypto.cipher_list()

if ciphers then

log.info("crypto", "ciphers list", json.encode(ciphers))

end


5.12 crypto.cipher_suites()

获取当前固件支持的 cipher suites 列表

参数

返回值

返回值类型
解释
table
本固件支持的 cipher suites 列表,字符串数组

例子

-- 本 API 于 2022.11.16 添加

local suites = crypto.cipher_suites()

if suites then

log.info("crypto", "ciphers suites", json.encode(suites))

end


5.13 crypto.cipher_encrypt(type, padding, str, key, iv)

对称加密

参数

传入值类型
解释
string
算法名称, 例如 AES-128-ECB/AES-128-CBC, 可查阅 crypto.cipher_list()
string
对齐方式, 支持 PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE
string
需要加密的数据
string
密钥,需要对应算法的密钥长度
string
IV 值, 非 ECB 算法需要

返回值

返回值类型
解释
string
加密后的字符串

例子

-- 计算 AES

local data = crypto.cipher_encrypt("AES-128-ECB", "PKCS7", "1234567890123456", "1234567890123456")

local data2 = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", "1234567890123456", "1234567890123456", "1234567890666666")


5.14 crypto.cipher_decrypt(type, padding, str, key, iv)

对称解密

参数

传入值类型
解释
string
算法名称, 例如 AES-128-ECB/AES-128-CBC, 可查阅 crypto.cipher_list()
string
对齐方式, 支持 PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE
string
需要解密的数据
string
密钥,需要对应算法的密钥长度
string
IV 值, 非 ECB 算法需要

返回值

返回值类型
解释
string
解密后的字符串

例子

-- 用 AES 加密,然后用 AES 解密

local data = crypto.cipher_encrypt("AES-128-ECB", "PKCS7", "1234567890123456", "1234567890123456")

local data2 = crypto.cipher_decrypt("AES-128-ECB", "PKCS7", data, "1234567890123456")

-- data 的 hex 为 757CCD0CDC5C90EADBEEECF638DD0000

-- data2 的值为 1234567890123456


5.15 crypto.crc16(method, data, poly, initial, finally, inReversem outReverse)

计算 CRC16

参数

传入值类型
解释
string
CRC16 模式(”IBM”,”MAXIM”,”USB”,”MODBUS”,”CCITT”,”CCITT-FALSE”,”X25”,”XMODEM”,”DNP”,”USER-DEFINED”)
string
字符串
int
poly 值
int
initial 值
int
finally 值
int
输入反转,1 反转,默认 0 不反转
int
输入反转,1 反转,默认 0 不反转

返回值

返回值类型
解释
int
对应的 CRC16 值

例子

-- 计算 CRC16

local crc = crypto.crc16("")


5.16 crypto.crc16_modbus(data, start)

直接计算 modbus 的 crc16 值

参数

传入值类型
解释
string
数据
int
初始化值,默认 0xFFFF

返回值

返回值类型
解释
int
对应的 CRC16 值

例子

-- 计算 CRC16 modbus

local crc = crypto.crc16_modbus(data)

-- 2023.11.06 新增初始值设置

crc = crypto.crc16_modbus(data, 0xFFFF)


5.17 crypto.crc32(data)

计算 crc32 值

参数

传入值类型
解释
string
数据

返回值

返回值类型
解释
int
对应的 CRC32 值

例子

-- 计算 CRC32

local crc = crypto.crc32(data)


5.18 crypto.crc8(data, poly, start, revert)

计算 crc8 值

参数

传入值类型
解释
string
数据
int
crc 多项式,可选,如果不写,将忽略除了数据外所有参数
int
crc 初始值,可选,默认 0
boolean
是否需要逆序处理,默认否

返回值

返回值类型
解释
int
对应的 CRC8 值

例子

-- 计算 CRC8

local crc = crypto.crc8(data)

local crc = crypto.crc8(data, 0x31, 0xff, false)


5.19 crypto.crc7(data, poly, start)

计算 crc7 值

参数

传入值类型
解释
string
数据
int
crc 多项式,可选,默认 0xE5
int
crc 初始值,可选,默认 0x00

返回值

返回值类型
解释
int
对应的 CRC7 值

例子

-- 计算 CRC7, 本 API 于 2023.10.07 新增

local crc = crypto.crc7(data)

local crc = crypto.crc7(data, 0x31, 0xff)


5.20 crypto.checksum(data, mode)

计算 checksum 校验和

参数

传入值类型
解释
string
待计算的数据,必选
int
模式,累加模式, 0 - 异或, 1 - 累加, 默认为 0

返回值

返回值类型
解释
int
checksum 值,校验和

例子

-- 本函数在 2022.12.28 添加

-- 单纯计算 checksum 值

local ck = crypto.checksum("OK")

log.info("checksum", "ok", string.format("%02X", ck))-- 第二个参数 mode 在 2023.5.23 日添加


5.21 crypto.trng(len)

生成真随机数

参数

传入值类型
解释
int
数据长度

返回值

返回值类型
解释
string
指定随机数字符串

例子

-- 生成 32 位随机数 ir

local r = crypto.trng(4)

local _, ir = pack.unpack(r, "I")


5.22 crypto.totp(secret,time)

计算 TOTP 动态密码的结果

参数

传入值类型
解释
string
网站提供的密钥(就是 BASE32 编码后的结果)
int
可选,时间戳,默认当前时间

返回值

返回值类型
解释
int
计算得出的六位数结果 计算失败返回 nil

例子

--使用当前系统时间计算

local otp = crypto.totp("asdfassdfasdfass")

local r = crypto.totp("VK54ZXPO74ISEM2E",1646796576)


5.23 crypto.md_file(tp, path, hmac)

计算文件的 hash 值(md5/sha1/sha256 及 hmac 形式)

参数

传入值类型
解释
string
hash 类型, 大小字母, 例如 “MD5” “SHA1” “SHA256”
string
文件路径, 例如 /luadb/logo.jpg
string
hmac 值,可选

返回值

返回值类型
解释
string
HEX 过的 hash 值,若失败会无返回值

例子

-- 无 hmac 的 hash 值

log.info("md5", crypto.md_file("MD5", "/luadb/logo.jpg"))

log.info("sha1", crypto.md_file("SHA1", "/luadb/logo.jpg"))

log.info("sha256", crypto.md_file("SHA256", "/luadb/logo.jpg"))

-- 带 hmac 的 hash 值

log.info("hmac_md5", crypto.md_file("MD5", "/luadb/logo.jpg", "123456"))

log.info("hmac_sha1", crypto.md_file("SHA1", "/luadb/logo.jpg", "123456"))

log.info("hmac_sha256", crypto.md_file("SHA256", "/luadb/logo.jpg", "123456"))


5.24 crypto.md(tp, data, hmac)

计算数据的 hash 值(md5/sha1/sha256 及 hmac 形式)

参数

传入值类型
解释
string
hash 类型, 大小字母, 例如 “MD5” “SHA1” “SHA256”
string
待处理的数据
string
hmac 值,可选

返回值

返回值类型
解释
string
HEX 过的 hash 值,若失败会无返回值

例子

-- 无 hmac 的 hash 值

log.info("md5", crypto.md("MD5", "1234567890"))

log.info("sha1", crypto.md("SHA1", "1234567890"))

log.info("sha256", crypto.md("SHA256", "1234567890"))

-- 带 hmac 的 hash 值

log.info("hmac_md5", crypto.md("MD5", "1234567890", "123456"))

log.info("hmac_sha1", crypto.md("SHA1", "1234567890", "123456"))

log.info("hmac_sha256", crypto.md("SHA256", "1234567890", "123456"))


5.25 crypto.hash_init(tp)

创建流式 hash 用的 stream

参数

传入值类型
解释
string
hash 类型, 大写字母, 例如 “MD5” “SHA1” “SHA256”
string
hmac 值,可选

返回值

返回值类型
解释
userdata
成功返回一个数据结构,否则返回 nil

例子

-- 无 hmac 的 hash stream

local md5_stream = crypto.hash_init("MD5")

local sha1_stream = crypto.hash_init("SHA1")

local sha256_stream = crypto.hash_init("SHA256")

-- 带 hmac 的 hash stream

local md5_stream = crypto.hash_init("MD5", "123456")

local sha1_stream = crypto.hash_init("SHA1", "123456")

local sha256_stream = crypto.hash_init("SHA256", "123456")


5.26 crypto.hash_update(stream, data)

流式 hash 更新数据

参数

传入值类型
解释
userdata
crypto.hash_init()创建的 stream, 必选
string
待计算的数据,必选
return

返回值

例子

crypto.hash_update(stream, "OK")


5.27 crypto.hash_finish(stream)

获取流式 hash 校验值并释放创建的 stream

参数

传入值类型
解释
userdata
crypto.hash_init()创建的 stream,必选

返回值

返回值类型
解释
string
成功返回计算得出的流式 hash 值的 hex 字符串,失败无返回

例子

local hashResult = crypto.hash_finish(stream)


六、功能验证

6.1 烧录固件

6.1.1 正确连接电脑和 4G 模组电路板

使用带有数据通信功能的数据线,不要使用仅有充电功能的数据线.

6.1.2 识别 4G 模组的 BOOT 引脚

Air201进入boot下载模式,烧录固件和程序,需要将预留的测试点(Air201板子 B面图) 的BOOT 上拉到vdd_ext(A面USB旁边),之后上电开机,即可进入下载模式,下载完程序后将boot脚悬空。

Air201板子 A面图

Air201板子 B面图

6.1.3 识别电脑的正确端口

判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:

6.1.4 用 Luatools 工具烧录

  • 新建项目

首先,确保你的 Luatools 的版本,大于等于 3.0.6 版本的.

在 Luatools 的左上角上有版本显示的,如图所示:

!

Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:

这时会弹出项目管理和烧录管理的对话框,可以新建一个项目,如下图:

  • 开始烧录

选择 Air780E 板子对应的底层 core 和刚改的 main.lua 脚本文件.下载到板子中.

点击下载后,我们需要进入 BOOT 模式才能正常下载.

如果没进入 BOOT 模式会出现下图情况:

进入 BOOT 模式下载,如图:

6.2 例程

参考以下示例,本库有专属 demo,点此链接查看 crypto 的 demo 例子

sys.taskInit(function()

    sys.wait(1000)

    -- MD5,输出结果已经hex编码
    log.info("md5", crypto.md5("abc"))
    log.info("hmac_md5", crypto.hmac_md5("abc", "1234567890"))

    -- SHA1,输出结果已经hex编码
    log.info("sha1", crypto.sha1("abc"))
    log.info("hmac_sha1", crypto.hmac_sha1("abc", "1234567890"))

    -- SHA256,输出结果已经hex编码
    log.info("sha256", crypto.sha256("abc"))
    log.info("hmac_sha256", crypto.hmac_sha256("abc", "1234567890"))

    -- SHA512,输出结果已经hex编码
    log.info("sha512", crypto.sha512("abc"))
    log.info("hmac_sha512", crypto.hmac_sha512("abc", "1234567890"))

        local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "ZERO", "023001", "HZBIT@WLW/YSBKEY")
        log.info("AES", "aes-128-ecb", data_encrypt:toHex())
        local data_decrypt = crypto.cipher_decrypt("AES-128-ECB", "ZERO", data_encrypt, "HZBIT@WLW/YSBKEY")
        log.info("AES", "aes-128-ecb", data_decrypt)

    -- AES加密, 未经Hex编码. AES-128-ECB 算法,待加密字符串如果超过32字节会报错,待查. by wendal 20200812
    local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "PKCS7", "12345678901234 > 123456", "1234567890123456")
    local data2_encrypt = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", "12345678901234 > 123456", "1234567890123456", "1234567890666666")
    log.info("AES", "aes-128-ecb", data_encrypt:toHex())
    log.info("AES", "aes-128-cbc", data2_encrypt:toHex())

    -- AES解密, 未经Hex编码
    local data_decrypt = crypto.cipher_decrypt("AES-128-ECB", "PKCS7", data_encrypt, "1234567890123456")
    local data2_decrypt = crypto.cipher_decrypt("AES-128-CBC", "PKCS7", data2_encrypt, "1234567890123456", "1234567890666666")
    log.info("AES", "aes-128-ecb", data_decrypt)
    log.info("AES", "aes-128-cbc", data2_decrypt)
    log.info("mem", rtos.meminfo("sys"))

    -- DES-ECB 加解密
    local data1 = crypto.cipher_encrypt("DES-ECB", "PKCS7", "abcdefg", "12345678")
    if data1 then -- DES-ECB 在某些平台不支持的
        log.info("des", data1:toHex())
        local data2 = crypto.cipher_decrypt("DES-ECB", "PKCS7", data1, "12345678")
        log.info("des", data2)
    else
        log.info("des", "当前固件不支持DES/3DES")
    end

    -- 3DES-ECB 加解密
    local data1 = crypto.cipher_encrypt("DES-EDE3-ECB", "PKCS7", "abcdefg!!--ZZSS", "123456781234567812345678")
    if data1 then -- DES-ECB 在某些平台不支持的
        log.info("3des", data1:toHex())
        local data2 = crypto.cipher_decrypt("DES-EDE3-ECB", "PKCS7", data1, "123456781234567812345678")
        log.info("3des", data2)
    else
        log.info("3des", "当前固件不支持DES/3DES")
    end


    -- 打印所有支持的cipher
    if crypto.cipher_list then
        log.info("cipher", "list", json.encode(crypto.cipher_list()))
    else
        log.info("cipher", "当前固件不支持crypto.cipher_list")
    end
    -- 打印所有支持的cipher suites
    if crypto.cipher_suites then
        log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
    else
        log.info("cipher", "当前固件不支持crypto.cipher_suites")
    end

    -- ---------------------------------------
    log.info("随机数测试")
    for i=1, 10 do
        sys.wait(100)
        log.info("crypto", "真随机数",string.unpack("I",crypto.trng(4)))
         log.info("crypto", "伪随机数",math.random()) -- 输出的是浮点数,不推荐
         log.info("crypto", "伪随机数",math.random(1, 65525)) -- 不推荐
    end

    -- totp的密钥
    log.info("totp的密钥")
    local secret = "VK54ZXPO74ISEM2E"
    --写死时间戳用来测试
    local ts = 1646796576
    --生成十分钟的动态码验证下
    for i=1,600,30 do
        local r = crypto.totp(secret,ts+i)
        local time = os.date("*t",ts+i + 8*3600)--东八区
        log.info("totp", string.format("%06d" ,r),time.hour,time.min,time.sec)
    end

    -- 文件测试
    log.info("文件hash值测试")
    if crypto.md_file then
        log.info("md5", crypto.md_file("MD5", "/luadb/logo.jpg"))
        log.info("sha1", crypto.md_file("SHA1", "/luadb/logo.jpg"))
        log.info("sha256", crypto.md_file("SHA256", "/luadb/logo.jpg"))

        log.info("hmac_md5", crypto.md_file("MD5", "/luadb/logo.jpg", "123456"))
        log.info("hmac_sha1", crypto.md_file("SHA1", "/luadb/logo.jpg", "123456"))
        log.info("hmac_sha256", crypto.md_file("SHA256", "/luadb/logo.jpg", "123456"))
    else
        log.info("文件hash值测试", "当前固件不支持crypto.md_file")
    end

    -- if crypto.checksum then
    --     log.info("checksum", "OK", string.char(crypto.checksum("OK")):toHex())
    --     log.info("checksum", "357E", string.char(crypto.checksum("357E", 1)):toHex())
    -- else
    --     log.info("checksum", "当前固件不支持crypto.checksum")
    -- end

    -- 流式hash测试
    log.info("流式hash测试")
    if crypto.hash_init then
        -- MD5
        local md5_obj = crypto.hash_init("MD5")
        crypto.hash_update(md5_obj, "1234567890")
        crypto.hash_update(md5_obj, "1234567890")
        crypto.hash_update(md5_obj, "1234567890")
        crypto.hash_update(md5_obj, "1234567890")
        local md5_result = crypto.hash_finish(md5_obj)
        log.info("md5_stream", md5_result)
        log.info("md5", crypto.md5("1234567890123456789012345678901234567890"))

        -- HMAC_MD5
        local hmac_md5_obj = crypto.hash_init("MD5", "1234567890")
        crypto.hash_update(hmac_md5_obj, "1234567890")
        crypto.hash_update(hmac_md5_obj, "1234567890")
        crypto.hash_update(hmac_md5_obj, "1234567890")
        crypto.hash_update(hmac_md5_obj, "1234567890")
        local hmac_md5_result = crypto.hash_finish(hmac_md5_obj)
        log.info("hmac_md5_stream", hmac_md5_result)
        log.info("hmac_md5", crypto.hmac_md5("1234567890123456789012345678901234567890", "1234567890"))

        -- SHA1
        local sha1_obj = crypto.hash_init("SHA1")
        crypto.hash_update(sha1_obj, "1234567890")
        crypto.hash_update(sha1_obj, "1234567890")
        crypto.hash_update(sha1_obj, "1234567890")
        crypto.hash_update(sha1_obj, "1234567890")
        local sha1_result = crypto.hash_finish(sha1_obj)
        log.info("sha1_stream", sha1_result)
        log.info("sha1", crypto.sha1("1234567890123456789012345678901234567890"))

        -- HMAC_SHA1
        local hmac_sha1_obj = crypto.hash_init("SHA1", "1234567890")
        crypto.hash_update(hmac_sha1_obj, "1234567890")
        crypto.hash_update(hmac_sha1_obj, "1234567890")
        crypto.hash_update(hmac_sha1_obj, "1234567890")
        crypto.hash_update(hmac_sha1_obj, "1234567890")
        local hmac_sha1_result = crypto.hash_finish(hmac_sha1_obj)
        log.info("hmac_sha1_stream", hmac_sha1_result)
        log.info("hmac_sha1", crypto.hmac_sha1("1234567890123456789012345678901234567890", "1234567890"))

        -- SHA256
        local sha256_obj = crypto.hash_init("SHA256")
        crypto.hash_update(sha256_obj, "1234567890")
        crypto.hash_update(sha256_obj, "1234567890")
        crypto.hash_update(sha256_obj, "1234567890")
        crypto.hash_update(sha256_obj, "1234567890")
        local sha256_result = crypto.hash_finish(sha256_obj)
        log.info("sha256_stream", sha256_result)
        log.info("sha256", crypto.sha256("1234567890123456789012345678901234567890"))

        -- HMAC_SHA256
        local hmac_sha256_obj = crypto.hash_init("SHA256", "1234567890")
        crypto.hash_update(hmac_sha256_obj, "1234567890")
        crypto.hash_update(hmac_sha256_obj, "1234567890")
        crypto.hash_update(hmac_sha256_obj, "1234567890")
        crypto.hash_update(hmac_sha256_obj, "1234567890")
        local hmac_sha256_result = crypto.hash_finish(hmac_sha256_obj)
        log.info("hmac_sha256_stream", hmac_sha256_result)
        log.info("hmac_sha256", crypto.hmac_sha256("1234567890123456789012345678901234567890", "1234567890"))

        -- SHA512
        local sha512_obj = crypto.hash_init("SHA512")
        if sha512_obj then
            crypto.hash_update(sha512_obj, "1234567890")
            crypto.hash_update(sha512_obj, "1234567890")
            crypto.hash_update(sha512_obj, "1234567890")
            crypto.hash_update(sha512_obj, "1234567890")
            local sha512_result = crypto.hash_finish(sha512_obj)
            log.info("sha512_stream", sha512_result)
            log.info("sha512", crypto.sha512("1234567890123456789012345678901234567890"))
        end

        -- HMAC_SHA512
        local hmac_sha512_obj = crypto.hash_init("SHA512", "1234567890")
        if hmac_sha512_obj then
            crypto.hash_update(hmac_sha512_obj, "1234567890")
            crypto.hash_update(hmac_sha512_obj, "1234567890")
            crypto.hash_update(hmac_sha512_obj, "1234567890")
            crypto.hash_update(hmac_sha512_obj, "1234567890")
            local hmac_sha512_result = crypto.hash_finish(hmac_sha512_obj)
            log.info("hmac_sha512_stream", hmac_sha512_result)
            log.info("hmac_sha512", crypto.hmac_sha512("1234567890123456789012345678901234567890", "1234567890"))
        end
    else
        log.info("crypto", "当前固件不支持crypto.hash_init")
    end

   log.info("crc7测试")
    if crypto.crc7 then
        local result = crypto.crc7(string.char(0xAA), 0xE5, 0x00)
        log.info("crc7测试", result, string.format("%02X", result))
    else
        log.info("crypto", "当前固件不支持crypto.crc7")
    end

    log.info("crypto", "ALL Done")
    sys.wait(100000)
end)

6.3 对应 log

[2024-11-11 14:56:37.255][000000000.212] I/user.main    cryptodemo  1.0.0
[2024-11-11 14:56:37.885][000000001.222] I/user.md5 900150983CD24FB0D6963F7D28E17F72
[2024-11-11 14:56:37.889][000000001.223] I/user.hmac_md5    416478FC0ACE1C4AB37F85F4F86A16B1
[2024-11-11 14:56:37.893][000000001.224] I/user.sha1    A9993E364706816ABA3E25717850C26C9CD0D89D
[2024-11-11 14:56:37.898][000000001.225] I/user.hmac_sha1   DAE54822C0DAF6C115C97B0AD62C7BCBE9D5E6FC
[2024-11-11 14:56:37.902][000000001.225] I/user.sha256  BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
[2024-11-11 14:56:37.906][000000001.226] I/user.hmac_sha256 86055184805B4A466A7BE398FF4A7159F9055EA7EEF339FC94DCEC6F165898BA
[2024-11-11 14:56:37.911][000000001.227] I/user.sha512  DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F
[2024-11-11 14:56:37.915][000000001.228] I/user.hmac_sha512 0F92B9AC88949E0BF7C9F1E6F9901BAB8EDFDC9E561DFDE428BC4339961A0569AD01B44343AA56E439949655D15C4D28492D459E75015489920243F3C9986F2A
[2024-11-11 14:56:37.920][000000001.228] zero padding
[2024-11-11 14:56:37.924][000000001.229] I/user.AES aes-128-ecb 013EEA6EBACCBD7AD990FAEF75FB99C4    32
[2024-11-11 14:56:37.932][000000001.229] I/user.AES aes-128-ecb 023001
[2024-11-11 14:56:37.936][000000001.230] I/user.AES aes-128-ecb A37DE67837A1A3006E47A7BC25AA0ECC030B4E058E1972FE5B257FD8C3436142    64
[2024-11-11 14:56:37.943][000000001.231] I/user.AES aes-128-cbc 26D98EA512AE92BC487536B83F2BE99B467649A9700338F4B4FF75AA2654DD2C    64
[2024-11-11 14:56:37.949][000000001.231] I/user.AES aes-128-ecb 12345678901234 > 123456
[2024-11-11 14:56:37.954][000000001.232] I/user.AES aes-128-cbc 12345678901234 > 123456
[2024-11-11 14:56:37.958][000000001.232] I/user.mem 236424  61132   63240
[2024-11-11 14:56:37.963][000000001.233] I/user.des 486CB8B81CACCDB7    16
[2024-11-11 14:56:37.970][000000001.234] I/user.des abcdefg
[2024-11-11 14:56:37.974][000000001.235] I/user.3des    14619F067B425995D0CD975B85491D98    32
[2024-11-11 14:56:37.981][000000001.235] I/user.3des    abcdefg!!--ZZSS
[2024-11-11 14:56:37.985][000000001.237] I/user.cipher  list    ["AES-128-ECB","AES-192-ECB","AES-256-ECB","AES-128-CBC","AES-192-CBC","AES-256-CBC","AES-128-CTR","AES-192-CTR","AES-256-CTR","AES-128-CCM","AES-192-CCM","AES-256-CCM","DES-ECB","DES-EDE-ECB","DES-EDE3-ECB","DES-CBC","DES-EDE-CBC","DES-EDE3-CBC"]
[2024-11-11 14:56:37.990][000000001.243] I/user.cipher  suites  
[2024-11-11 14:56:37.994][000000001.243] ["TLS-ECDHE-ECDSA-WITH-AES-256-CCM","TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384","TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384","TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA","TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA","TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8","TLS-ECDHE-ECDSA-WITH-AES-128-CCM","TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256","TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256","TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA","TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA","TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8","TLS-RSA-WITH-AES-256-CCM","TLS-RSA-WITH-AES-256-CBC-SHA256","TLS-RSA-WITH-AES-256-CBC-SHA","TLS-RSA-WITH-AES-256-CCM-8","TLS-RSA-WITH-AES-128-CCM","TLS-RSA-WITH-AES-128-CBC-SHA256","TLS-RSA-WITH-AES-128-CBC-SHA","TLS-RSA-WITH-AES-128-CCM-8","TLS-RSA-PSK-WITH-AES-256-CBC-SHA384","TLS-RSA-PSK-WITH-AES-256-CBC-SHA","TLS-RSA-PSK-WITH-AES-128-CBC-SHA256","TLS-RSA-PSK-WITH-AES-128-CBC-SHA","TLS-PSK-WITH-AES-256-CCM","TLS-PSK-WITH-AES-256-CBC-SHA384","TLS-PSK-WITH-AES-256-CBC-SHA","TLS-PSK-WITH-AES-256-CCM-8","TLS-PSK-WITH-AES-128-CCM","TLS-PSK-WITH-AES-128-CBC-SHA256","TLS-PSK-WITH-AES-128-CBC-SHA","TLS-PSK-WITH-AES-128-CCM-8"]
[2024-11-11 14:56:38.004][000000001.244] I/user.随机数测试
[2024-11-11 14:56:38.014][000000001.353] I/user.crypto  真随机数    -1757951694 5
[2024-11-11 14:56:38.121][000000001.454] I/user.crypto  真随机数    -12472324   5
[2024-11-11 14:56:38.215][000000001.555] I/user.crypto  真随机数    1534976033  5
[2024-11-11 14:56:38.312][000000001.656] I/user.crypto  真随机数    1255965100  5
[2024-11-11 14:56:38.420][000000001.757] I/user.crypto  真随机数    -86083566   5
[2024-11-11 14:56:38.477][000000001.796] cid1, state0
[2024-11-11 14:56:38.480][000000001.797] bearer act 0, result 0
[2024-11-11 14:56:38.486][000000001.797] NETIF_LINK_ON -> IP_READY
[2024-11-11 14:56:38.529][000000001.867] I/user.crypto  真随机数    -178469792  5
[2024-11-11 14:56:38.530][000000001.868] TIME_SYNC 0
[2024-11-11 14:56:38.638][000000001.976] I/user.crypto  真随机数    -962199930  5
[2024-11-11 14:56:38.732][000000002.077] I/user.crypto  真随机数    1755442940  5
[2024-11-11 14:56:38.841][000000002.178] I/user.crypto  真随机数    2137312187  5
[2024-11-11 14:56:38.935][000000002.279] I/user.crypto  真随机数    -951916880  5
[2024-11-11 14:56:38.938][000000002.280] I/user.totp的密钥
[2024-11-11 14:56:38.942][000000002.284] I/user.totp    522113  19  29  37
[2024-11-11 14:56:38.946][000000002.285] I/user.totp    964300  19  30  7
[2024-11-11 14:56:38.949][000000002.286] I/user.totp    987714  19  30  37
[2024-11-11 14:56:38.953][000000002.287] I/user.totp    037499  19  31  7
[2024-11-11 14:56:38.957][000000002.288] I/user.totp    699697  19  31  37
[2024-11-11 14:56:38.960][000000002.289] I/user.totp    548191  19  32  7
[2024-11-11 14:56:38.964][000000002.290] I/user.totp    747517  19  32  37
[2024-11-11 14:56:38.968][000000002.291] I/user.totp    243319  19  33  7
[2024-11-11 14:56:38.977][000000002.293] I/user.totp    147474  19  33  37
[2024-11-11 14:56:38.990][000000002.294] I/user.totp    039992  19  34  7
[2024-11-11 14:56:38.998][000000002.295] I/user.totp    628512  19  34  37
[2024-11-11 14:56:39.004][000000002.296] I/user.totp    529018  19  35  7
[2024-11-11 14:56:39.011][000000002.297] I/user.totp    994006  19  35  37
[2024-11-11 14:56:39.018][000000002.298] I/user.totp    851359  19  36  7
[2024-11-11 14:56:39.023][000000002.299] I/user.totp    943237  19  36  37
[2024-11-11 14:56:39.029][000000002.300] I/user.totp    410702  19  37  7
[2024-11-11 14:56:39.035][000000002.301] I/user.totp    082993  19  37  37
[2024-11-11 14:56:39.040][000000002.302] I/user.totp    193281  19  38  7
[2024-11-11 14:56:39.046][000000002.303] I/user.totp    781573  19  38  37
[2024-11-11 14:56:39.051][000000002.304] I/user.totp    243288  19  39  7
[2024-11-11 14:56:39.056][000000002.305] I/user.文件hash值测试
[2024-11-11 14:56:39.060][000000002.308] I/user.md5 D364D04CCD734D2757B25F3216CC431B
[2024-11-11 14:56:39.064][000000002.312] I/user.sha1    04DA64874D415B1FB9CDD2E89927397D8F48C441
[2024-11-11 14:56:39.068][000000002.325] I/user.sha256  0C601722B4BD2BC1A76BC3701F4EB646F5119C31702852978C326CD8D7C9212C
[2024-11-11 14:56:39.073][000000002.328] I/user.hmac_md5    B5F5A687DB904DB67D3311899932DD61
[2024-11-11 14:56:39.077][000000002.332] I/user.hmac_sha1   2A0B55C290D54ADF2F185EAE460254D267C7CE1F
[2024-11-11 14:56:39.081][000000002.345] I/user.hmac_sha256 6E443C84D4D7A4721A9A195EB9038EDCFA8A8F60A3F1E8A0090B57B3BAB4942E
[2024-11-11 14:56:39.085][000000002.346] I/user.checksum    OK  04  2
[2024-11-11 14:56:39.089][000000002.346] I/user.checksum    357E    E4  2
[2024-11-11 14:56:39.093][000000002.346] I/user.流式hash测试
[2024-11-11 14:56:39.097][000000002.347] I/user.md5_stream  F5BF3E984432AE6F9F98840951E5CEF3
[2024-11-11 14:56:39.101][000000002.348] I/user.md5 F5BF3E984432AE6F9F98840951E5CEF3
[2024-11-11 14:56:39.107][000000002.348] I/user.hmac_md5_stream 45527D9407615C3A44F475BB7172752A
[2024-11-11 14:56:39.110][000000002.349] I/user.hmac_md5    45527D9407615C3A44F475BB7172752A
[2024-11-11 14:56:39.114][000000002.350] I/user.sha1_stream C61A2C245CB07A04482CE5B662AE67DBDBE010DB
[2024-11-11 14:56:39.118][000000002.350] I/user.sha1    C61A2C245CB07A04482CE5B662AE67DBDBE010DB
[2024-11-11 14:56:39.124][000000002.351] I/user.hmac_sha1_stream    88471065B8C5F64057418A0A58353A46E7841DE7
[2024-11-11 14:56:39.128][000000002.352] I/user.hmac_sha1   88471065B8C5F64057418A0A58353A46E7841DE7
[2024-11-11 14:56:39.132][000000002.353] I/user.sha256_stream   A4EBDD541454B84CC670C9F1F5508BAF67FFD3FE59B883267808781F992A0B1D
[2024-11-11 14:56:39.137][000000002.353] I/user.sha256  A4EBDD541454B84CC670C9F1F5508BAF67FFD3FE59B883267808781F992A0B1D
[2024-11-11 14:56:39.141][000000002.354] I/user.hmac_sha256_stream  EAF715932F064E462893B7FE04442E2C25ECF2F7C560820A648D0D94BEAEB581
[2024-11-11 14:56:39.146][000000002.355] I/user.hmac_sha256 EAF715932F064E462893B7FE04442E2C25ECF2F7C560820A648D0D94BEAEB581
[2024-11-11 14:56:39.149][000000002.356] I/user.sha512_stream   3A8529D8F0C7B1AD2FA54C944952829B718D5BEB4FF9BA8F4A849E02FE9A272DAF59AE3BD06DDE6F01DF863D87C8BA4AB016AC576B59A19078C26D8DBE63F79E
[2024-11-11 14:56:39.156][000000002.356] I/user.sha512  3A8529D8F0C7B1AD2FA54C944952829B718D5BEB4FF9BA8F4A849E02FE9A272DAF59AE3BD06DDE6F01DF863D87C8BA4AB016AC576B59A19078C26D8DBE63F79E
[2024-11-11 14:56:39.158][000000002.358] I/user.hmac_sha512_stream  18F74340A0048090521796F52A66A45B77AF5981512951B938BFCB026F2D6ED7945B0682731E4E7E3CA72021E5E8AB9810769E48C83F440DC73D6C942215E29E
[2024-11-11 14:56:39.161][000000002.359] I/user.hmac_sha512 18F74340A0048090521796F52A66A45B77AF5981512951B938BFCB026F2D6ED7945B0682731E4E7E3CA72021E5E8AB9810769E48C83F440DC73D6C942215E29E
[2024-11-11 14:56:39.165][000000002.359] I/user.crc7测试
[2024-11-11 14:56:39.168][000000002.360] I/user.crc7测试  124 7C
[2024-11-11 14:56:39.173][000000002.360] I/user.crypto  ALL Done

七、总结

通过本章内容的学习,你可以学习到有关加解密算法的函数,例如:crypto.md5(str)、crypto.hmac_md5(str, key)、crypto.hmac_sha1(str, key) 等等函数.