通用加解密函数(crypto)
一、加解密概述
加解密算法是保证数据安全的基础技术,无论是在数据传输、存储,还是用户身份验证中,都起着至关重要的作用.随着互联网的发展和信息安全威胁的增加,了解并掌握常用的加解密算法已经成为开发者和安全从业者的必修课.
常见的 15 种加密解密算法分别是:散列哈希[MD5、SHA1、CRC32],对称[DES,3DES(TDEA、Triple DES),AES、,Blowfish,RC4、RC5,IDEA],Base64、Rabbit、Escape.
【三种分类】
1、对称加密:对称加密是指加密和解密使用同一个密钥的加密方法.由于加密和解密过程中的密钥相同,因此需要在通信双方之间安全地共享密钥.对称加密的速度较快,适合用于大量数据的加密
2、非对称加密:非对称加密算法采用一对密钥:公钥和私钥.公钥用于加密,私钥用于解密.由于加密和解密使用不同的密钥,非对称加密算法解决了密钥分发的问题,是当前加密系统中安全性最高的加密技术之一.
3、Hash 算法,这是一种不可逆的算法,它常用于验证数据的完整性
二、演示功能概述
本文章通过 Air780 的核心板烧录 LuatOS 示例代码(点此链接查看 crypto 的 demo 例子),来演示有关加解密的各种 API 的功能.
API 的具体用法,读者可以参考本文中的"五、API 说明".
三、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
四、软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools工具;
2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件;
3. luatos需要的脚本和资源文件
脚本和资源文件点击此处查看与下载
lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。
五、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 引脚
在下载之前,要用模组的 BOOT 引脚触发下载, 也就是说,要把 4G 模组的 BOOT 引脚拉到 1.8v,或者直接把 BOOT 引脚和 VDD_EXT 引脚相连.我们要在按下 BOOT 按键时让模块开机,就可以进入下载模式了.
具体到 Air780EP 开发板:
1、当我们模块没开机时,按着 BOOT 键然后长按 POW 开机.
2、当我们模块开机时,按着 BOOT 键然后点按重启键即可.
6.1.3 识别电脑的正确端口
判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:
6.1.4 用 Luatools 工具烧录
- 新建项目
首先,确保你的 Luatools 的版本,大于等于 3.0.6 版本的.
在 Luatools 的左上角上有版本显示的,如图所示:
Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:
这时会弹出项目管理和烧录管理的对话框,可以新建一个项目,如下图:
- 开始烧录
选择 Air780EP 板子对应的底层 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-10-18 10:28:48.224][000000001.281] I/user.md5 900150983CD24FB0D6963F7D28E17F72
[2024-10-18 10:28:48.226][000000001.283] I/user.hmac_md5 416478FC0ACE1C4AB37F85F4F86A16B1
[2024-10-18 10:28:48.228][000000001.284] I/user.sha1 A9993E364706816ABA3E25717850C26C9CD0D89D
[2024-10-18 10:28:48.229][000000001.285] I/user.hmac_sha1 DAE54822C0DAF6C115C97B0AD62C7BCBE9D5E6FC
[2024-10-18 10:28:48.230][000000001.287] I/user.sha256 BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
[2024-10-18 10:28:48.231][000000001.288] I/user.hmac_sha256 86055184805B4A466A7BE398FF4A7159F9055EA7EEF339FC94DCEC6F165898BA
[2024-10-18 10:28:48.232][000000001.289] I/user.sha512 DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F
[2024-10-18 10:28:48.233][000000001.292] I/user.hmac_sha512 0F92B9AC88949E0BF7C9F1E6F9901BAB8EDFDC9E561DFDE428BC4339961A0569AD01B44343AA56E439949655D15C4D28492D459E75015489920243F3C9986F2A
[2024-10-18 10:28:48.236][000000001.293] D/crypto zero padding
[2024-10-18 10:28:48.237][000000001.294] I/user.AES aes-128-ecb 013EEA6EBACCBD7AD990FAEF75FB99C4 32
[2024-10-18 10:28:48.238][000000001.295] I/user.AES aes-128-ecb 023001
[2024-10-18 10:28:48.240][000000001.297] I/user.AES aes-128-ecb A37DE67837A1A3006E47A7BC25AA0ECC030B4E058E1972FE5B257FD8C3436142 64
[2024-10-18 10:28:48.242][000000001.298] I/user.AES aes-128-cbc 26D98EA512AE92BC487536B83F2BE99B467649A9700338F4B4FF75AA2654DD2C 64
[2024-10-18 10:28:48.243][000000001.300] I/user.AES aes-128-ecb 12345678901234 > 123456
[2024-10-18 10:28:48.245][000000001.300] I/user.AES aes-128-cbc 12345678901234 > 123456
[2024-10-18 10:28:48.246][000000001.301] I/user.mem 277872 52116 81264
[2024-10-18 10:28:48.247][000000001.303] I/user.des 486CB8B81CACCDB7 16
[2024-10-18 10:28:48.249][000000001.304] I/user.des abcdefg
[2024-10-18 10:28:48.250][000000001.306] I/user.3des 14619F067B425995D0CD975B85491D98 32
[2024-10-18 10:28:48.251][000000001.308] I/user.3des abcdefg!!--ZZSS
[2024-10-18 10:28:48.254][000000001.311] 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-GCM","AES-192-GCM","AES-256-GCM","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-10-18 10:28:48.271][000000001.322] I/user.cipher suites
[2024-10-18 10:28:48.276][000000001.322] ["TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384","TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384","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-GCM-SHA256","TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256","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-GCM-SHA384","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-GCM-SHA256","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-GCM-SHA384","TLS-RSA-PSK-WITH-AES-256-CBC-SHA384","TLS-RSA-PSK-WITH-AES-256-CBC-SHA","TLS-RSA-PSK-WITH-AES-128-GCM-SHA256","TLS-RSA-PSK-WITH-AES-128-CBC-SHA256","TLS-RSA-PSK-WITH-AES-128-CBC-SHA","TLS-PSK-WITH-AES-256-GCM-SHA384","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-GCM-SHA256","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-10-18 10:28:48.286][000000001.324] I/user.随机数测试
[2024-10-18 10:28:48.379][000000001.433] I/user.crypto 真随机数 261494196 5
[2024-10-18 10:28:48.384][000000001.434] I/user.crypto 伪随机数 0.6484701
[2024-10-18 10:28:48.388][000000001.435] I/user.crypto 伪随机数 19789
[2024-10-18 10:28:48.490][000000001.537] I/user.crypto 真随机数 486511786 5
[2024-10-18 10:28:48.493][000000001.538] I/user.crypto 伪随机数 0.2389479
[2024-10-18 10:28:48.495][000000001.539] I/user.crypto 伪随机数 5261
[2024-10-18 10:28:48.598][000000001.650] I/user.crypto 真随机数 1880424108 5
[2024-10-18 10:28:48.602][000000001.651] I/user.crypto 伪随机数 0.4170769
[2024-10-18 10:28:48.604][000000001.652] I/user.crypto 伪随机数 18390
[2024-10-18 10:28:48.691][000000001.753] I/user.crypto 真随机数 263035101 5
[2024-10-18 10:28:48.694][000000001.754] I/user.crypto 伪随机数 0.3004813
[2024-10-18 10:28:48.697][000000001.755] I/user.crypto 伪随机数 37550
[2024-10-18 10:28:48.817][000000001.865] I/user.crypto 真随机数 1468703251 5
[2024-10-18 10:28:48.822][000000001.866] I/user.crypto 伪随机数 0.3768688
[2024-10-18 10:28:48.824][000000001.867] I/user.crypto 伪随机数 15383
[2024-10-18 10:28:48.910][000000001.969] I/user.crypto 真随机数 -1162628970 5
[2024-10-18 10:28:48.914][000000001.971] I/user.crypto 伪随机数 0.1866591
[2024-10-18 10:28:48.915][000000001.972] I/user.crypto 伪随机数 21033
[2024-10-18 10:28:49.033][000000002.081] I/user.crypto 真随机数 -963368157 5
[2024-10-18 10:28:49.035][000000002.082] I/user.crypto 伪随机数 0.5439283
[2024-10-18 10:28:49.038][000000002.084] I/user.crypto 伪随机数 36118
[2024-10-18 10:28:49.128][000000002.185] I/user.crypto 真随机数 1180427239 5
[2024-10-18 10:28:49.130][000000002.186] I/user.crypto 伪随机数 0.9506377
[2024-10-18 10:28:49.132][000000002.187] I/user.crypto 伪随机数 44024
[2024-10-18 10:28:49.237][000000002.297] I/user.crypto 真随机数 1100990233 5
[2024-10-18 10:28:49.239][000000002.298] I/user.crypto 伪随机数 0.6049858
[2024-10-18 10:28:49.241][000000002.299] I/user.crypto 伪随机数 61459
[2024-10-18 10:28:49.347][000000002.401] I/user.crypto 真随机数 -1319279350 5
[2024-10-18 10:28:49.349][000000002.402] I/user.crypto 伪随机数 0.5302082
[2024-10-18 10:28:49.351][000000002.403] I/user.crypto 伪随机数 41229
[2024-10-18 10:28:49.353][000000002.404] I/user.totp的密钥
[2024-10-18 10:28:49.356][000000002.406] I/user.totp 522113 19 29 37
[2024-10-18 10:28:49.358][000000002.408] I/user.totp 964300 19 30 7
[2024-10-18 10:28:49.360][000000002.411] I/user.totp 987714 19 30 37
[2024-10-18 10:28:49.363][000000002.413] I/user.totp 037499 19 31 7
[2024-10-18 10:28:49.364][000000002.415] I/user.totp 699697 19 31 37
[2024-10-18 10:28:49.366][000000002.417] I/user.totp 548191 19 32 7
[2024-10-18 10:28:49.368][000000002.419] I/user.totp 747517 19 32 37
[2024-10-18 10:28:49.371][000000002.421] I/user.totp 243319 19 33 7
[2024-10-18 10:28:49.373][000000002.423] I/user.totp 147474 19 33 37
[2024-10-18 10:28:49.376][000000002.425] I/user.totp 039992 19 34 7
[2024-10-18 10:28:49.378][000000002.427] I/user.totp 628512 19 34 37
[2024-10-18 10:28:49.379][000000002.429] I/user.totp 529018 19 35 7
[2024-10-18 10:28:49.382][000000002.431] I/user.totp 994006 19 35 37
[2024-10-18 10:28:49.384][000000002.433] I/user.totp 851359 19 36 7
[2024-10-18 10:28:49.386][000000002.435] I/user.totp 943237 19 36 37
[2024-10-18 10:28:49.388][000000002.437] I/user.totp 410702 19 37 7
[2024-10-18 10:28:49.391][000000002.440] I/user.totp 082993 19 37 37
[2024-10-18 10:28:49.392][000000002.442] I/user.totp 193281 19 38 7
[2024-10-18 10:28:49.394][000000002.444] I/user.totp 781573 19 38 37
[2024-10-18 10:28:49.395][000000002.446] I/user.totp 243288 19 39 7
[2024-10-18 10:28:49.396][000000002.447] I/user.文件hash值测试
[2024-10-18 10:28:49.408][000000002.454] I/user.md5 D364D04CCD734D2757B25F3216CC431B
[2024-10-18 10:28:49.409][000000002.462] I/user.sha1 04DA64874D415B1FB9CDD2E89927397D8F48C441
[2024-10-18 10:28:49.440][000000002.483] I/user.sha256 0C601722B4BD2BC1A76BC3701F4EB646F5119C31702852978C326CD8D7C9212C
[2024-10-18 10:28:49.443][000000002.490] I/user.hmac_md5 B5F5A687DB904DB67D3311899932DD61
[2024-10-18 10:28:49.446][000000002.499] I/user.hmac_sha1 2A0B55C290D54ADF2F185EAE460254D267C7CE1F
[2024-10-18 10:28:49.472][000000002.520] I/user.hmac_sha256 6E443C84D4D7A4721A9A195EB9038EDCFA8A8F60A3F1E8A0090B57B3BAB4942E
[2024-10-18 10:28:49.475][000000002.521] I/user.流式hash测试
[2024-10-18 10:28:49.478][000000002.523] I/user.md5_stream F5BF3E984432AE6F9F98840951E5CEF3
[2024-10-18 10:28:49.481][000000002.524] I/user.md5 F5BF3E984432AE6F9F98840951E5CEF3
[2024-10-18 10:28:49.483][000000002.526] I/user.hmac_md5_stream 45527D9407615C3A44F475BB7172752A
[2024-10-18 10:28:49.487][000000002.527] I/user.hmac_md5 45527D9407615C3A44F475BB7172752A
[2024-10-18 10:28:49.490][000000002.529] I/user.sha1_stream C61A2C245CB07A04482CE5B662AE67DBDBE010DB
[2024-10-18 10:28:49.491][000000002.530] I/user.sha1 C61A2C245CB07A04482CE5B662AE67DBDBE010DB
[2024-10-18 10:28:49.492][000000002.532] I/user.hmac_sha1_stream 88471065B8C5F64057418A0A58353A46E7841DE7
[2024-10-18 10:28:49.494][000000002.533] I/user.hmac_sha1 88471065B8C5F64057418A0A58353A46E7841DE7
[2024-10-18 10:28:49.496][000000002.535] I/user.sha256_stream A4EBDD541454B84CC670C9F1F5508BAF67FFD3FE59B883267808781F992A0B1D
[2024-10-18 10:28:49.497][000000002.536] I/user.sha256 A4EBDD541454B84CC670C9F1F5508BAF67FFD3FE59B883267808781F992A0B1D
[2024-10-18 10:28:49.498][000000002.538] I/user.hmac_sha256_stream EAF715932F064E462893B7FE04442E2C25ECF2F7C560820A648D0D94BEAEB581
[2024-10-18 10:28:49.500][000000002.540] I/user.hmac_sha256 EAF715932F064E462893B7FE04442E2C25ECF2F7C560820A648D0D94BEAEB581
[2024-10-18 10:28:49.501][000000002.542] I/user.sha512_stream 3A8529D8F0C7B1AD2FA54C944952829B718D5BEB4FF9BA8F4A849E02FE9A272DAF59AE3BD06DDE6F01DF863D87C8BA4AB016AC576B59A19078C26D8DBE63F79E
[2024-10-18 10:28:49.502][000000002.543] I/user.sha512 3A8529D8F0C7B1AD2FA54C944952829B718D5BEB4FF9BA8F4A849E02FE9A272DAF59AE3BD06DDE6F01DF863D87C8BA4AB016AC576B59A19078C26D8DBE63F79E
[2024-10-18 10:28:49.504][000000002.546] I/user.hmac_sha512_stream 18F74340A0048090521796F52A66A45B77AF5981512951B938BFCB026F2D6ED7945B0682731E4E7E3CA72021E5E8AB9810769E48C83F440DC73D6C942215E29E
[2024-10-18 10:28:49.507][000000002.548] I/user.hmac_sha512 18F74340A0048090521796F52A66A45B77AF5981512951B938BFCB026F2D6ED7945B0682731E4E7E3CA72021E5E8AB9810769E48C83F440DC73D6C942215E29E
[2024-10-18 10:28:49.509][000000002.549] I/user.crc7测试
[2024-10-18 10:28:49.510][000000002.550] I/user.crc7测试 124 7C
[2024-10-18 10:28:49.513][000000002.551] I/user.crypto ALL Done
七、总结
通过本章内容的学习,你可以学习到有关加解密算法的函数,例如:crypto.md5(str)、crypto.hmac_md5(str, key)、crypto.hmac_sha1(str, key) 等等函数.
给读者的话
本篇文章由公帅开发;
本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air780EP-LuatOS-软件指南-通用工具库-通用加解密函数(crypto);
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!