硬汉嵌入式论坛

 找回密码
 立即注册
查看: 132|回复: 2
收起左侧

[LUA教程] H7-TOOL的LUA小程序教程第18期:ECDSA签名私钥公钥生成,签名和校验LUA函数(2026-04-10,已更新)

[复制链接]

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121980
QQ
发表于 7 天前 | 显示全部楼层 |阅读模式
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。



重要说明

ECDSA是基于椭圆曲线密码学的数字签名算法,用于验证数据的真实性和完整性。它比传统的RSA更安全且密钥更短。我们这里直接对芯片UID进行签名,将签名作为"芯片证书"。

1、ECDSA使用的曲线是SECP256R1
2、哈希值计算使用的SHA224

LUA函数说明:

1、生成公钥,私钥

Private_Key, Public_Key, re = cmox_ecdsa_keyGen()

这个是硬件真随机数生成的公钥和私钥。

返回值Private_Key,返回32字节私钥数值,非字符串,纯数值
返回值Public_Key,返回64字节公钥数值,非字符串,纯数值
返回值re,re = 1表示成功, re = 0表示失败

2、生成签名
sign, re = cmox_ecdsa_sign(Private_Key, Private_KeySize,  uid, #uid)

生成签名是通过私钥,对用户指定的数据生成签名值,特别注意,我们这里对数据的哈希计算是采用的SHA224

返回值sign,返回签名值
返回值re, re = 1表示成功,re = 0表示失败

参数Private_Key, 要写入的私钥,要写入数组值,非字符串
参数Private_KeySize,私钥的字节数
参数uid, 要签名的数值,要写入数组值,非字符串
参数#uid,要签名的字节数

3、签名验证
re = cmox_ecdsa_verify(Public_Key, Public_KeySize, uid, #uid, sign, #sign)

签名验证是通过公钥,要签名的数据和签名验证的。

返回值re,re = 1表示成功,re = 0表示失败
参数Public_Key,       公钥数组,非字符串
参数Public_KeySize, 公钥数组字节数
参数uid,   数据数组
参数#uid, 数据数组字节数
参数sign,  签名数组
参数#sign,签名数组字节数


举例:

完整测试代码:

[Lua] 纯文本查看 复制代码
local s = ""
local Private_KeySize = 32 -- 私钥长度为32字节
local Public_KeySize = 64  -- 公钥长度为64字节
local SignSize = 64        -- ECDSA签名长度为64字节
local ENCRYPT_LEN = 128    -- 签名长度 + 公钥长度,固定128字节
local Private_Key = {}
local Public_Key = {}

local re
local uid = {}
local x = {}
local sign = {}

-- 依次返回私钥, 公钥和成功状态
Private_Key, Public_Key, re = cmox_ecdsa_keyGen()
if(re == 1) then
    print("cmox_ecdsa_keyGen success")
else
    print(sring.format("cmox_ecdsa_keyGen fail, re = %d", re))
end

print("ENCRYPT_LEN = ", ENCRYPT_LEN)

----------------打印私钥----------------------------
Private_KeySize = #Private_Key
print("Private_KeySize = ", Private_KeySize)
s = "Private_Key = {\n"
for i=1, Private_KeySize, 1 do                                
    s =s..string.format("0x%02x", Private_Key)..","
    if i % 16 == 0 then
        s = s.."\n"
    end                                
end
s =s.."}\n"
print(s) 

---------------打印公钥-----------------------------
Public_KeySize = #Public_Key
print("Public_KeySize = ", Public_KeySize)
s = "Public_Key = {\n"
for i=1, Public_KeySize, 1 do                                
    s =s..string.format("0x%02x", Public_Key)..","
    if i % 16 == 0 then
        s = s.."\n"
    end                                
end
s =s.."}\n"
print(s) 

---------------读取UID----------------------------
re, uid = pg_read_uid(0x1FF1E800)  -- 这里是读取的STM32H7的UID地址,其他芯片需要修改地址
if(re == 1) then
    print("pg_read_uid success")
else
    print("pg_read_uid fail")
    uid = {0,1,2,3, 4,5,6,7, 8,9,10,11} -- 随意定义一个,用于测试
end

for i = 1, #uid do
   x = string.byte(uid, i) --由于返回的是字符串,所以需要转换成字节数组
end

---------------求签名----------------------------
sign, re = cmox_ecdsa_sign(Private_Key, Private_KeySize, x, #uid)

if(re == 1) then
    print("cmox_ecdsa_sign success")
    SignSize = #sign
    print("SignSize = ", SignSize)
    s = "Sign = {\n"
    for i=1, SignSize, 1 do                                
        s =s..string.format("0x%02x", sign)..","
        if i % 16 == 0 then
            s = s.."\n"
        end                                
    end
    s =s.."}\n"
    print(s) 
else
    print(string.format("cmox_ecdsa_sign fail, re = %d", re))
end

---------------验证签名----------------------------
re = cmox_ecdsa_verify(Public_Key, Public_KeySize, x, #uid, sign, #sign)
if(re == 1) then
    print("cmox_ecdsa_verify success")
else
    print(string.format("cmox_ecdsa_verify fail, re = %d", re))
end



123.png


参考资料
1、实现H7-TOOL脱机烧录ECDSA数字签名算法对目标芯片做UID签名(2026-02-28)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=131058

2、https://en.wikipedia.org/wiki/El ... Signature_Algorithm

回复

使用道具 举报

4

主题

144

回帖

156

积分

初级会员

积分
156
QQ
发表于 5 天前 | 显示全部楼层
期待!!
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121980
QQ
 楼主| 发表于 2 小时前 | 显示全部楼层
更新完成
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-4-10 13:04 , Processed in 3.235983 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表