Files
mobile_comm/luatos/air780epm/module/Air780EPM/demo/crypto/crypto_app.lua
T
wangfq 173dd6874f init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
2026-08-31 08:53:49 +08:00

283 lines
12 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--[[
@module crypto_app
@summary crypto_app应用功能模块
@version 1.0
@date 2025.10.15
@author 沈园园
@usage
本文件为crypto_app应用功能模块,核心业务逻辑为:
1、演示有关加解密的各种 API 的功能包含MD5SHA,哈希(MD5SHA)AES/DEC/3DESCRCchecksum校验和;
本文件没有对外接口,直接在main.lua中require "crypto_app"就可以加载运行;
]]
--加密运算主函数
local function crypto_task_func()
-- MD5/哈希MD5,输出结果已经hex编码
log.info("md5", crypto.md5("abc"))
log.info("hmac_md5", crypto.hmac_md5("abc", "1234567890"))
-- SHA1/哈希SHA1,输出结果已经hex编码
log.info("sha1", crypto.sha1("abc"))
log.info("hmac_sha1", crypto.hmac_sha1("abc", "1234567890"))
-- SHA256/哈希SHA256,输出结果已经hex编码
log.info("sha256", crypto.sha256("abc"))
log.info("hmac_sha256", crypto.hmac_sha256("abc", "1234567890"))
-- SHA512/哈希SHA512,输出结果已经hex编码
log.info("sha512", crypto.sha512("abc"))
log.info("hmac_sha512", crypto.hmac_sha512("abc", "1234567890"))
-- AES加密, 未经Hex编码. AES-128-ECB 算法 对称加密,对齐方式:"ZERO"
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/CBC 算法 对称加密,对齐方式:"PKCS7"
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编码, AES-128-ECB/CBC 算法 对称解密,,对齐方式:"PKCS7"
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
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
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
-- 计算CRC16
local originStr = "123456sdfdsfdsfdsffdsfdsfsdfs1234"
local crc16 = crypto.crc16("MODBUS",originStr)
log.info("crc16", crc16)
-- 计算CRC16 modbus
local crc16 = crypto.crc16_modbus("123456sdfdsfdsfdsffdsfdsfsdfs1234")
log.info("crc16", crc16)
crc16 = crypto.crc16_modbus("123456sdfdsfdsfdsffdsfdsfsdfs1234", 0xFFFF)
log.info("crc16", crc16)
-- 计算CRC32
local data = "123456sdfdsfdsfdsffdsfdsfsdfs1234"
local crc32 = crypto.crc32(data)
log.info("crc32", crc32) --21438764
-- start和poly可选, 是 2025.4.14 新增的参数
local crc32 = crypto.crc32(data, 0xFFFFFFFF, 0x04C11DB7, 0xFFFFFFFF) --等同于crypto.crc32(data)
log.info("crc32", crc32)
-- 计算CRC8
local data= "sdfdsfdsfdsffdsfdsfsdfs1234"
local crc8 = crypto.crc8(data)
log.info("crc8", crc8)
local crc8 = crypto.crc8(data, 0x31, 0xff, false)
log.info("crc8", crc8)
-- 计算CRC7
if crypto.crc7 then
local result = crypto.crc7("abc", 0xE5, 0x00)
log.info("crc7", result, string.format("%02X", result)) --50 32
else
log.info("crypto", "当前固件不支持crypto.crc7")
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
--将数据进行base64编码
-- 本函数与 string.toBase64 是同一个
local bdata = crypto.base64_encode("123")
log.info("base64", "encode", bdata)
--将数据进行base64解码
-- 本函数与 string.fromBase64 是同一个
local data = crypto.base64_decode("MTIz")
log.info("base64", "decode", bdata, data)--123
-- 打印所有支持的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
-- 计算文件的hash值(md5/sha1/sha256及hmac形式)
log.info("文件hash值测试")
if crypto.md_file then
-- 无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"))
else
log.info("文件hash值测试", "当前固件不支持crypto.md_file")
end
--计算数据的hash值(md5/sha1/sha256及hmac形式)
if crypto.md then
-- 无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"))
else
log.info("数据hash值测试", "当前固件不支持crypto.md")
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
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
log.info("crypto", "ALL Done")
sys.wait(100000)
end
--创建一个task,并且运行task的主函数crypto_task_func
sys.taskInit(crypto_task_func)