crypto - 加解密和hash函数
一、概述
加解密算法是信息安全领域的核心技术,用于保护数据的机密性、完整性和真实性。根据加密密钥的特点和应用场景,可分为对称加密、非对称加密、哈希算法三大类,以下是具体介绍:
一、对称加密算法(Symmetric Encryption)
特点:加密和解密使用相同的密钥,运算速度快,适合处理大量数据。
1. AES(Advanced Encryption Standard,高级加密标准)
- 地位:目前应用最广泛的对称加密算法,替代了 DES 成为国际标准。
- 密钥长度:128 位、192 位、256 位(密钥越长,安全性越高)。
- 工作模式:支持 ECB、CBC、GCM 等(推荐 GCM,带认证功能)。
- 应用场景:文件加密、数据库加密、SSL/TLS 会话加密、磁盘加密(如 BitLocker)。
- 优势:安全性高(256 位密钥目前无法被暴力破解)、速度快、跨平台支持好。
2. DES/3DES(Data Encryption Standard)
- DES:老牌算法,密钥长度 56 位,安全性不足(已被破解),基本淘汰。
- 3DES:对 DES 进行三次加密,密钥长度 168 位,安全性提升,但速度较慢,逐渐被 AES 替代。
- 应用:早期金融系统、信用卡加密(部分遗留系统仍在使用)。
3. ChaCha20
- 特点:流加密算法,无需填充,适合网络传输(如 HTTPS)和移动端。
- 优势:在硬件不支持 AES 加速时,性能优于 AES,安全性高。
- 应用:SSH、Tor、Android 加密等。
二、非对称加密算法(Asymmetric Encryption)
特点:使用公钥(加密)和私钥(解密) 一对密钥,公钥可公开,私钥需保密,安全性高但速度慢,适合小数据加密(如密钥交换)。
1. RSA
- 原理:基于大整数分解难题(质因数分解)。
- 密钥长度:推荐 2048 位及以上(1024 位已不安全)。
- 应用场景:数字签名、密钥交换(如 HTTPS 握手时交换对称密钥)、证书加密。
- 局限:密钥生成慢,加密大数据效率低。
2. ECC(Elliptic Curve Cryptography,椭圆曲线加密)
- 原理:基于椭圆曲线离散对数难题,相同安全级别下,密钥长度远小于 RSA(如 256 位 ECC ≈ 3072 位 RSA)。
- 优势:速度快、密钥短、适合资源受限场景(移动端、物联网)。
- 应用:比特币、区块链、移动支付(如 Apple Pay)、SSL/TLS(现代浏览器优先支持)。
3. SM2(国密算法)
- 特点:中国自主设计的椭圆曲线算法,类似 ECC,满足国家密码标准。
- 应用:政务系统、金融领域(如银行、证券)、国内合规场景。
三、哈希算法(Hash Algorithm)
特点:将任意长度数据转换为固定长度的哈希值(摘要),不可逆(无法从哈希值还原原始数据),用于数据完整性校验和身份认证。
1. SHA 系列(Secure Hash Algorithm)
- SHA-256:生成 256 位哈希值,应用最广,安全性高(抗碰撞能力强)。
- SHA-3:新一代哈希标准,基于海绵结构,替代 SHA-2(尚未完全普及)。
- 应用:文件校验(如 BT 种子)、密码存储(加盐哈希)、区块链(比特币用 SHA-256)。
2. MD5
- 特点:生成 128 位哈希值,速度快,但已被破解(存在碰撞漏洞)。
- 现状:仅用于非安全场景(如文件校验),禁止用于密码存储或关键数据。
3. SM3(国密算法)
- 特点:中国自主设计,类似 SHA-256,用于国内政务、金融等合规场景。
四、典型应用场景
- HTTPS 通信:
- 非对称加密(RSA/ECC):用于客户端和服务器交换对称密钥(如 AES 密钥)。
- 对称加密(AES):用于加密后续传输的大量数据(速度快)。
- 哈希算法(SHA-256):用于验证服务器证书的完整性。
- 文件加密:
- 对称加密(AES-256):直接加密文件内容(效率高)。
- 密钥管理:用用户密码加密 AES 密钥(避免明文存储)。
- 数字签名:
- 哈希算法(SHA-256):对原始数据生成摘要。
- 非对称加密(RSA/ECC):用私钥加密摘要,接收方用公钥解密并验证。
五、选择建议
- 大量数据加密:优先用 AES(速度快、安全性高)。
- 密钥交换 / 数字签名:用 ECC(密钥短、效率高)或 RSA(兼容性好)。
- 数据完整性校验:用 SHA-256(避免 MD5)。
- 国内合规场景:选择国密算法(SM2/SM3/SM4)。
加解密算法的安全性依赖于密钥管理(如密钥长度、存储安全),即使是强算法,若密钥泄露也会导致安全失效。
二、核心示例
1、核心示例是指:使用本库文件提供的核心API,开发的基础业务逻辑的演示代码;
2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;
3、更加完整和详细的demo,请参考 LuatOS仓库 中各个产品目录下的demo/crypto
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)
三、常量详解
核心库常量,顾名思义是由合宙LuatOS内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
crypto值核心库没有常量。
四、函数详解
crypto.md5(str)
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
返回值 local data = crypto.md5(str)
data
含义说明:计算得出的md5值的hex字符串
数据类型:string;
取值范围:32;
注意事项:暂无;
返回示例:"900150983CD24FB0D6963F7D28E17F72";
示例
-- 计算字符串"abc"的md5
log.info("md5", crypto.md5("abc"))
--"900150983CD24FB0D6963F7D28E17F72"
crypto.hmac_md5(str, key)
计算hmac_md5值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
key
参数含义:密钥
数据类型:string;
取值范围:无强制上下限,但推荐 16~64 字节,最优为 64 字节;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"1234567890";
返回值 local data = crypto.hmac_md5(str, key)
data
含义说明:计算得出的md5值的hex字符串
数据类型:string;
取值范围:32;
注意事项:暂无;
返回示例:"416478FC0ACE1C4AB37F85F4F86A16B1";
示例
-- 计算字符串"abc"的hmac_md5
log.info("hmac_md5", crypto.hmac_md5("abc", "1234567890"))
--"416478FC0ACE1C4AB37F85F4F86A16B1"
crypto.sha1(str)
计算sha1值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
返回值 local data = crypto.sha1(str)
data
含义说明:计算得出的sha1值的hex字符串
数据类型:string;
取值范围:40;
注意事项:暂无;
返回示例:"A9993E364706816ABA3E25717850C26C9CD0D89D";
示例
-- 计算字符串"abc"的sha1
log.info("sha1", crypto.sha1("abc"))
--"A9993E364706816ABA3E25717850C26C9CD0D89D"
crypto.hmac_sha1(str, key)
计算hmac_sha1值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
key
参数含义:密钥
数据类型:string;
取值范围:无强制上下限,但推荐 16~64 字节,最优为 64 字节;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"1234567890";
返回值 local data = crypto.hmac_sha1(str, key)
data
含义说明:计算得出的hmac_sha1值的hex字符串
数据类型:string;
取值范围:40;
注意事项:暂无;
返回示例:"DAE54822C0DAF6C115C97B0AD62C7BCBE9D5E6FC";
示例
-- 计算字符串"abc"的hmac_sha1
log.info("hmac_sha1", crypto.hmac_sha1("abc", "1234567890"))
--"DAE54822C0DAF6C115C97B0AD62C7BCBE9D5E6FC"
crypto.sha256(str)
计算sha256值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
返回值 local data = crypto.sha256(str)
data
含义说明:计算得出的sha256值的hex字符串
数据类型:string;
取值范围:64;
注意事项:暂无;
返回示例:"BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD";
示例
-- 计算字符串"abc"的sha256
log.info("sha256", crypto.sha256("abc"))
--"BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
crypto.hmac_sha256(str, key)
计算hmac_sha256值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
key
参数含义:密钥
数据类型:string;
取值范围:无强制上下限,但推荐 32~64 字节,最优为 64 字节;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"1234567890";
返回值 local data = crypto.hmac_sha256(str, key)
data
含义说明:计算得出的hmac_sha256值的hex字符串
数据类型:string;
取值范围:64;
注意事项:暂无;
返回示例:"86055184805B4A466A7BE398FF4A7159F9055EA7EEF339FC94DCEC6F165898BA";
示例
-- 计算字符串"abc"的hmac_sha256
log.info("hmac_sha256", crypto.hmac_sha256("abc", "1234567890"))
--"86055184805B4A466A7BE398FF4A7159F9055EA7EEF339FC94DCEC6F165898BA";
crypto.sha512(str)
计算sha512值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
返回值 local data = crypto.sha512(str)
data
含义说明:计算得出的sha512值的hex字符串
数据类型:string;
取值范围:128;
注意事项:暂无;
返回示例:"DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F";
示例
-- 计算字符串"abc"的sha512
log.info("sha512", crypto.sha512("abc"))
--"DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F"
crypto.hmac_sha512(str, key)
计算hmac_sha512值
参数
str
参数含义:需要计算的字符串
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
key
参数含义:密钥
数据类型:string;
取值范围:无强制上下限,但推荐 64~128 字节,最优为 128 字节;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"1234567890";
返回值 local data = crypto.hmac_sha512(str, key)
data
含义说明:计算得出的hmac_sha512值的hex字符串
数据类型:string;
取值范围:64;
注意事项:暂无;
返回示例:"0F92B9AC88949E0BF7C9F1E6F9901BAB8EDFDC9E561DFDE428BC4339961A0569AD01B44343AA56E439949655D15C4D28492D459E75015489920243F3C9986F2A";
示例
-- 计算字符串"abc"的hmac_sha512
log.info("hmac_sha512", crypto.hmac_sha512("abc", "1234567890"))
--"0F92B9AC88949E0BF7C9F1E6F9901BAB8EDFDC9E561DFDE428BC4339961A0569AD01B44343AA56E439949655D15C4D28492D459E75015489920243F3C9986F2A"
crypto.cipher_encrypt(type, padding, str, key, iv)
对称加密
参数
type
参数含义:算法名称,
数据类型:string;
取值范围:例如 AES-128-ECB/AES-128-CBC, 可查阅crypto.cipher_list();
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"AES-128-ECB";
padding
参数含义:对齐方式
数据类型:string;
取值范围:支持PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"ZERO";
str
参数含义:需要加密的数据
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"023001";
key
参数含义:密钥
数据类型:string;
取值范围:{
无统一长度:完全依赖底层加密算法(对称 / 非对称);
对称算法:密钥长度固定可选(如 AES 16/24/32 字节),需严格匹配;
非对称算法:密钥长度有推荐范围(如 RSA 2048/4096 位),需符合算法格式;
}
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"HZBIT@WLW/YSBKEY";
iv
参数含义:IV值
数据类型:string;
取值范围:{
块加密算法:IV 长度 = 算法的块大小(AES 16 字节,3DES 8 字节);
加密模式:CBC/CTR 等模式必须使用 IV,ECB 模式禁止使用且不推荐;
安全要求:IV 需随机生成、每次加密不同、无需保密但必须随密文传输。
实际开发中,需根据所使用的算法和模式确定 IV 长度,且严格遵循随机生成和唯一性原则。
};
是否必选:非ECB算法需要;
注意事项:暂无;
参数示例:"1234567890123456";
返回值 local data_encrypt = crypto.cipher_encrypt(type, padding, str, key, iv)
data_encrypt
含义说明:加密后的字符串
数据类型:string;
取值范围:cipher_encrypt 是加密函数的抽象名称,其输出的密文长度取决于多个因素,包括原始明文长度、加密算法、分组模式、填充方式等,没有固定值;
注意事项:暂无;
返回示例:"013EEA6EBACCBD7AD990FAEF75FB99C4";
示例
-- 计算AES
local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "ZERO", "023001", "HZBIT@WLW/YSBKEY")
local data2_encrypt = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", "12345678901234 > 123456", "1234567890123456", "1234567890666666")
crypto.cipher_decrypt(type, padding, str, key, iv)
对称解密
参数
type
参数含义:算法名称,
数据类型:string;
取值范围:例如 AES-128-ECB/AES-128-CBC, 可查阅crypto.cipher_list();
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"AES-128-ECB";
padding
参数含义:对齐方式
数据类型:string;
取值范围:支持PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"ZERO";
str
参数含义:需要解密的数据
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"013EEA6EBACCBD7AD990FAEF75FB99C4";
key
参数含义:密钥
数据类型:string;
取值范围:{
无统一长度:完全依赖底层加密算法(对称 / 非对称);
对称算法:密钥长度固定可选(如 AES 16/24/32 字节),需严格匹配;
非对称算法:密钥长度有推荐范围(如 RSA 2048/4096 位),需符合算法格式;
}
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"HZBIT@WLW/YSBKEY";
iv
参数含义:IV值
数据类型:string;
取值范围:{
块加密算法:IV 长度 = 算法的块大小(AES 16 字节,3DES 8 字节);
加密模式:CBC/CTR 等模式必须使用 IV,ECB 模式禁止使用且不推荐;
安全要求:IV 需随机生成、每次加密不同、无需保密但必须随密文传输。
实际开发中,需根据所使用的算法和模式确定 IV 长度,且严格遵循随机生成和唯一性原则。
};
是否必选:非ECB算法需要;
注意事项:暂无;
参数示例:"1234567890666666";
返回值
local data_encrypt = crypto.cipher_decrypt(type, padding, str, key, iv)
data_encrypt
含义说明:解密后的字符串;
数据类型:string;
取值范围:加密之前的数据长度;
注意事项:暂无;
返回示例:"023001";
示例
-- 用AES加密,然后用AES解密
local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "ZERO", "023001", "HZBIT@WLW/YSBKEY")
log.info("AES", "aes-128-ecb", data_encrypt:toHex()) --013EEA6EBACCBD7AD990FAEF75FB99C4 32
local data_decrypt = crypto.cipher_decrypt("AES-128-ECB", "ZERO", data_encrypt, "HZBIT@WLW/YSBKEY")
log.info("AES", "aes-128-ecb", data_decrypt)--023001
local data2_encrypt = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", "12345678901234 > 123456", "1234567890123456", "1234567890666666")
log.info("AES", "aes-128-cbc", data2_encrypt:toHex())--26D98EA512AE92BC487536B83F2BE99B467649A9700338F4B4FF75AA2654DD2C 64
local data2_decrypt = crypto.cipher_decrypt("AES-128-CBC", "PKCS7", data2_encrypt, "1234567890123456", "1234567890666666")
log.info("AES", "aes-128-cbc", data2_decrypt)--12345678901234 > 123456
crypto.crc16(method, data, poly, initial, finally, inReverse, outReverse)
计算CRC16
参数
method
参数含义:CRC16模式;
数据类型:string;
取值范围:"IBM","MAXIM","USB","MODBUS","CCITT","CCITT-FALSE","X25","XMODEM","DNP","USER-DEFINED";
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"IBM";
data
参数含义:需要校验的字符串;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"123456sdfdsfdsfdsffdsfdsfsdfs1234";
poly
参数含义:16 位多项式;
数据类型:int;
取值范围:范围0-0xFFFF;
是否必选:可选传入此参数,默认0x0000;
注意事项:暂无;
参数示例:0x0000;
initial
参数含义:初始校验值;
数据类型:int;
取值范围:范围0-0xFFFF;
是否必选:可选传入此参数,默认0x0000;
注意事项:暂无;
参数示例:0x0000;
finally
参数含义:计算完成后的异或值;
数据类型:int;
取值范围:范围0-0xFFFF;
是否必选:可选传入此参数,默认0x0000;
注意事项:暂无;
参数示例:0x0000;
inReverse
参数含义:输入字节是否进行位反转(影响每个字节的处理顺序);
数据类型:int;
取值范围:1反转,默认0不反转;
是否必选:可选传入此参数,不填时,默认是0;
注意事项:暂无;
参数示例:0;
outReverse
参数含义:输出结果是否进行位反转;
数据类型:int;
取值范围:1反转,默认0不反转;
是否必选:可选传入此参数,不填时,默认是0;
注意事项:暂无;
参数示例:0;
返回值
local crc16 = crypto.crc16(method, data, poly, initial, finally, inReverse, outReverse)
crc16
含义说明:对应的CRC16值;
数据类型:int;
取值范围:0 到 65535;
注意事项:暂无;
返回示例:54188;
示例
-- 计算CRC16
local originStr = "123456sdfdsfdsfdsffdsfdsfsdfs1234"
local crc16 = crypto.crc16("MODBUS",originStr)
log.info("crc16", crc16) --54188
crypto.crc16_modbus(data, start)
直接计算modbus的crc16值
参数
data
参数含义:需要校验的字符串;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"123456sdfdsfdsfdsffdsfdsfsdfs1234";
start
参数含义:初始化值,默认0xFFFF;
数据类型:int;
取值范围:;
是否必选:可选传入此参数,不填时,默认是0xFFFF;
注意事项:暂无;
参数示例:0xFFFF;
返回值
local crc16 = crypto.crc16_modbus(data, start)
crc16
含义说明:对应的CRC16值;
数据类型:int;
取值范围:0 到 65535;
注意事项:暂无;
返回示例:54188;
示例
-- 计算CRC16 modbus
local crc16 = crypto.crc16_modbus("123456sdfdsfdsfdsffdsfdsfsdfs1234")
-- 2023.11.06 新增初始值设置
crc16 = crypto.crc16_modbus(data, 0xFFFF)
log.info("crc16", crc16) --54188
crypto.crc32(data, start, poly, endv)
计算crc32值
参数
data
参数含义:需要校验的字符串;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"sdfdsfdsfdsffdsfdsfsdfs1234";
start
参数含义:初始化值,默认0xFFFFFFFF;
数据类型:int;
取值范围:默认0xFFFFFFFF;
是否必选:可选传入此参数,不填时,默认0xFFFFFFFF;
注意事项:暂无;
参数示例:0xFFFF;
poly
参数含义:crc多项式;
数据类型:int;
取值范围:默认0x04C11DB7;
是否必选:可选,默认0x04C11DB7;
注意事项:暂无;
参数示例:0x04C11DB7;
endv
参数含义:结束值;
数据类型:int;
取值范围:计算完成后与结果进行异或的值(32 位整数),默认值为 0xFFFFFFFF(标准 CRC32 最终异或值);
是否必选:可选,默认0xFFFFFFFF;
注意事项:暂无;
参数示例:0x04C11DB7;
返回值
local crc32 = crypto.crc32(data, start, poly, endv)
crc16
含义说明:对应的CRC32值;
数据类型:int;
取值范围:32 位 CRC 校验值(范围:0x00000000 ~ 0xFFFFFFFF);
注意事项:暂无;
返回示例:21438764;
示例
-- 计算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) --21438764
crypto.crc8(data, poly, start, revert)
计算crc8值
参数
data
参数含义:需要校验的字符串;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"sdfdsfdsfdsffdsfdsfsdfs1234";
poly
参数含义:crc多项式;
数据类型:int;
取值范围:默认0;
是否必选:可选,如果不写,将忽略除了数据外所有参数;
注意事项:暂无;
参数示例:0x0;
start
参数含义:crc初始值;
数据类型:int;
取值范围:默认0;
是否必选:可选传入此参数,不填时,默认0;
注意事项:暂无;
参数示例:0;
revert
参数含义:是否需要逆序处理;
数据类型:boolean;
取值范围:true/false;
是否必选:可选,默认false;
注意事项:暂无;
参数示例:false;
返回值
local crc8 = crypto.crc8(data, poly, start, revert)
crc8
含义说明:对应的CRC8值;
数据类型:int;
取值范围:0 到 255;
注意事项:暂无;
返回示例:197;
示例
-- 计算CRC8
local data= "sdfdsfdsfdsffdsfdsfsdfs1234"
local crc8 = crypto.crc8(data)
log.info("crc8", crc8) --197
local crc8 = crypto.crc8(data, 0x31, 0xff, false)
log.info("crc8", crc8) --243
crypto.crc7(data, poly, start)
计算crc7值
参数
data
参数含义:需要校验的字符串;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"abc";
poly
参数含义:crc多项式;
数据类型:int;
取值范围:默认0xE5;
是否必选:可选;
注意事项:暂无;
参数示例:0xE5;
start
参数含义:crc初始值;
数据类型:int;
取值范围:0x00;
是否必选:可选传入此参数,不填时,默认0x00;
注意事项:暂无;
参数示例:0;
返回值
local crc7 = crypto.crc7(data, poly, start)
crc7
含义说明:对应的CRC7值;
数据类型:int;
取值范围:7 位的整数(范围:0x00 ~ 0x7F),即 CRC7 校验结果;
注意事项:暂无;
返回示例:50;
示例
-- 计算CRC7, 本API于2023.10.07新增
local result = crypto.crc7("abc", 0xE5, 0x00)
log.info("crc7", result, string.format("%02X", result)) --50 32
crypto.trng(len)
生成真随机数
参数
len
参数含义:数据长度;
数据类型:int;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:4;
返回值
local trdata = crypto.trng(len)
trdata
含义说明:指定长度随机数字符串;
数据类型:string;
取值范围:和指定长度有关;
注意事项:暂无;
返回示例:打印为不可显示字符,可以参考下面示例打印结果;
示例
-- 生成32位随机数ir
local r = crypto.trng(4)
local _, ir = pack.unpack(r, "I")
log.info("crypto ir", "真随机数",ir) --522532873
crypto.totp(secret,time)
计算TOTP动态密码的结果
参数
secret
参数含义:密钥(网站提供的密钥(BASE32编码后的结果));
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"VK54ZXPO74ISEM2E";
time
参数含义:时间戳;
数据类型:string;
取值范围:无特别限制;
是否必选:可选传入此参数,不填时,默认当前时间;
注意事项:暂无;
参数示例:1646796576;
返回值
local totp = crypto.totp(secret,time)
totp
含义说明:计算得出的六位数结果,计算失败返回nil;
数据类型:int;
取值范围:六位数结果或者nil;
注意事项:暂无;
返回示例:491229;
示例
local totp = crypto.totp("VK54ZXPO74ISEM2E")
log.info("totp",totp) --491229
crypto.base64_encode(data)
将数据进行base64编码
参数
data
参数含义:待编码的数据;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"123";
返回值
local bdata = crypto.base64_encode(data)
bdata
含义说明:编码后的数据;
数据类型:string;
取值范围:无特别限制;
注意事项:暂无;
返回示例:"MTIz";
示例
-- 本函数与 string.toBase64 是同一个
local bdata = crypto.base64_encode("123")
log.info("base64", "encode", bdata) --MTIz
crypto.base64_decode(data)
将数据进行base64解码
参数
data
参数含义:待解码的数据;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"MTIz";
返回值
local data = crypto.base64_decode(data)
data
含义说明:解码后的数据;
数据类型:string;
取值范围:无特别限制;
注意事项:暂无;
返回示例:"123";
示例
-- 本函数与 string.fromBase64 是同一个
local data = crypto.base64_decode("MTIz")
log.info("base64", "decode", bdata, data)--123
crypto.cipher_list()
获取当前固件支持的cipher列表
参数
无
返回值
local ciphers = crypto.cipher_list()
ciphers
含义说明:本固件支持的cipher列表,字符串数组;
数据类型:table;
取值范围:无特别限制;
注意事项:暂无;
返回示例:["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"]
[2025-10-05 16:22:37.889][00000001.006];
示例
-- 本API于2022.07.27添加
local ciphers = crypto.cipher_list()
if ciphers then
log.info("crypto", "ciphers list", json.encode(ciphers))
end
--["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"]
--[2025-10-05 16:22:37.889][00000001.006]
crypto.cipher_suites()
获取当前固件支持的cipher suites列表
参数
无
返回值
含义说明:本固件支持的cipher suites列表,字符串数组;
数据类型:table;
取值范围:无特别限制;
注意事项:暂无;
返回示例:[2025-10-05 16:22:37.889][00000001.006] ["TLS-RSA-WITH-AES-128-CCM","TLS-RSA-WITH-AES-128-CBC-SHA","TLS-RSA-WITH-AES-128-CCM-8","TLS-RSA-WITH-AES-128-CBC-SHA256","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-256-GCM-SHA384","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-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"][2025-10-05 16:22:37.889][00000001.006];
示例
-- 本API于2022.11.16添加
local suites = crypto.cipher_suites()
if suites then
log.info("crypto", "ciphers suites", json.encode(suites))
end
--[2025-10-05 16:22:37.889][00000001.006] ["TLS-RSA-WITH-AES-128-CCM","TLS-RSA-WITH-AES-128-CBC-SHA","TLS-RSA-WITH-AES-128-CCM-8","TLS-RSA-WITH-AES-128-CBC-SHA256","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-256-GCM-SHA384","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-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"][2025-10-05 16:22:37.889][00000001.006]
crypto.md_file(tp, path, hmac)
计算文件的hash值(md5/sha1/sha256及hmac形式)
参数
tp
参数含义:hash类型, 大小字母;
数据类型:string;
取值范围:"MD5" "SHA1" "SHA256";
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"MD5";
path
参数含义:文件路径, 例如 /luadb/logo.jpg;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"/luadb/logo.jpg";
hmac
参数含义:hmac值;
数据类型:string;
取值范围:无特别限制;
是否必选:可选;
注意事项:暂无;
参数示例:"MD5";
返回值
local hashdata = crypto.md_file(tp, path, hmac)
hashdata
含义说明:HEX过的hash值,若失败会无返回值;
数据类型:string或者nil;
取值范围:MD5 32,SHA1 40,SHA256 64;
注意事项:暂无;
返回示例:"D364D04CCD734D2757B25F3216CC431B";
示例
-- 无hmac的hash值
log.info("md5", crypto.md_file("MD5", "/luadb/logo.jpg"))
--D364D04CCD734D2757B25F3216CC431B
log.info("sha1", crypto.md_file("SHA1", "/luadb/logo.jpg"))
--04DA64874D415B1FB9CDD2E89927397D8F48C441
log.info("sha256", crypto.md_file("SHA256", "/luadb/logo.jpg"))
--0C601722B4BD2BC1A76BC3701F4EB646F5119C31702852978C326CD8D7C9212C
-- 带hmac的hash值
log.info("hmac_md5", crypto.md_file("MD5", "/luadb/logo.jpg", "123456"))
--B5F5A687DB904DB67D3311899932DD61
log.info("hmac_sha1", crypto.md_file("SHA1", "/luadb/logo.jpg", "123456"))
--2A0B55C290D54ADF2F185EAE460254D267C7CE1F
log.info("hmac_sha256", crypto.md_file("SHA256", "/luadb/logo.jpg", "123456"))
--6E443C84D4D7A4721A9A195EB9038EDCFA8A8F60A3F1E8A0090B57B3BAB4942E
crypto.md(tp, data, hmac)
计算数据的hash值(md5/sha1/sha256及hmac形式)
参数
tp
参数含义:hash类型, 大小字母;
数据类型:string;
取值范围:"MD5" "SHA1" "SHA256";
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"MD5";
data
参数含义:待处理的数据;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"1234567890";
hmac
参数含义:hmac值;
数据类型:string;
取值范围:无特别限制;
是否必选:可选;
注意事项:暂无;
参数示例:"123456";
返回值
local hashdata = crypto.md(tp, data, hmac)
hashdata
含义说明:HEX过的hash值,若失败会无返回值;
数据类型:string或者nil;
取值范围:MD5 32,SHA1 30,SHA256 64;
注意事项:暂无;
返回示例:"E807F1FCF82D132F9BB018CA6738A19F";
示例
-- 无hmac的hash值
log.info("md5", crypto.md("MD5", "1234567890"))
--E807F1FCF82D132F9BB018CA6738A19F
log.info("sha1", crypto.md("SHA1", "1234567890"))
--01B307ACBA4F54F55AAFC33BB06BBBF6CA803E9A
log.info("sha256", crypto.md("SHA256", "1234567890"))
--C775E7B757EDE630CD0AA1113BD102661AB38829CA52A6422AB782862F268646
-- 带hmac的hash值
log.info("hmac_md5", crypto.md("MD5", "1234567890", "123456"))
--3324A5385619D5485AAD1D8D274214A0
log.info("hmac_sha1", crypto.md("SHA1", "1234567890", "123456"))
--E374E1A5449F65E6566F910BAE824CE163B4CE3D
log.info("hmac_sha256", crypto.md("SHA256", "1234567890", "123456"))
--30CFE99B630FCFB71DA1D68FAAC41B9944728A44244A385DDAE0ADB35910BB41
crypto.hash_init(tp,hmac)
创建流式hash用的stream
参数
tp
参数含义:hash类型, 大小字母;
数据类型:string;
取值范围:"MD5" "SHA1" "SHA256";
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"MD5";
hmac
参数含义:hmac值;
数据类型:string;
取值范围:无特别限制;
是否必选:可选;
注意事项:暂无;
参数示例:"123456";
返回值
含义说明:成功返回一个数据结构,否则返回nil;
数据类型:userdata;
取值范围:无特别限制;
注意事项:暂无;
返回示例:;
示例
-- 无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")
crypto.hash_update(stream, data)
流式hash更新数据
参数
stream
参数含义:crypto.hash_init()创建的stream;
数据类型:userdata;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:;
data
参数含义:待计算的数据;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"OK";
返回值
无
示例
crypto.hash_update(stream, "OK")
crypto.hash_finish(stream)
获取流式hash校验值并释放创建的stream
参数
stream
参数含义:crypto.hash_init()创建的stream;
数据类型:userdata;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:;
返回值
local hashResult = crypto.hash_finish(stream)
hashResult
含义说明:成功返回计算得出的流式hash值的hex字符串,失败无返回;
数据类型:string;
取值范围:无特别限制;
注意事项:暂无;
返回示例:"F5BF3E984432AE6F9F98840951E5CEF3";
示例
-- 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) --F5BF3E984432AE6F9F98840951E5CEF3
log.info("md5", crypto.md5("1234567890123456789012345678901234567890")) --F5BF3E984432AE6F9F98840951E5CEF3
crypto.checksum(data, mode)
计算checksum校验和
参数
data
参数含义:待计算的数据;
数据类型:string;
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:暂无;
参数示例:"OK";
mode
参数含义:模式,累加模式, 0 - 异或, 1 - 累加;
数据类型:int;
取值范围:0 - 异或, 1 - 累加;
是否必选:非必须传入此参数,默认为0;
注意事项:暂无;
参数示例:0;
返回值
local ck = crypto.checksum(data, mode)
ck
含义说明:checksum值,校验和;
数据类型:int;
取值范围:;无特别限制
注意事项:暂无;
返回示例:4;
示例
-- 本函数在 2022.12.28 添加
-- 单纯计算checksum值
local ck = crypto.checksum("OK")
log.info("checksum", "ok", string.format("%02X", ck))--04
-- 第二个参数mode在2023.5.23日添加
五、产品支持说明
支持LuatOS开发的所有产品都支持cryto核心库。