跳转至

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,用于国内政务、金融等合规场景。

四、典型应用场景

  1. HTTPS 通信
  2. 非对称加密(RSA/ECC):用于客户端和服务器交换对称密钥(如 AES 密钥)。
  3. 对称加密(AES):用于加密后续传输的大量数据(速度快)。
  4. 哈希算法(SHA-256):用于验证服务器证书的完整性。
  5. 文件加密
  6. 对称加密(AES-256):直接加密文件内容(效率高)。
  7. 密钥管理:用用户密码加密 AES 密钥(避免明文存储)。
  8. 数字签名
  9. 哈希算法(SHA-256):对原始数据生成摘要。
  10. 非对称加密(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 等模式必须使用 IVECB 模式禁止使用且不推荐;
            安全要求: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 等模式必须使用 IVECB 模式禁止使用且不推荐;
            安全要求: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 32SHA1 40SHA256 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 32SHA1 30SHA256 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核心库。