请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[问题解答] 自己修改UID加密算法Lua脚本编写的一个问题。

[复制链接]

26

主题

137

回帖

215

积分

高级会员

积分
215
发表于 2025-3-30 11:51:42 | 显示全部楼层 |阅读模式
本帖最后由 ifree 于 2025-3-30 11:53 编辑

向自己尝试修改以下UID加密的LUA脚本。

目前用Lua调试窗口,执行如下Lua加密脚本代码,执行得到的加密结果与固件中的C语言代码生成结果相同。

[Lua] 纯文本查看 复制代码
local crypto_params = {
   ...
}

-- 二进制字符串转字节数组
local function str_to_bytes(s)
    local t = {}
    for i = 1, #s do
        t[i] = s:byte(i)
    end
    return t
end

-- 字节数组转二进制字符串
local function bytes_to_str(t)
    local s = {}
    for i = 1, #t do
        s[i] = string.char(t[i])
    end
    return table.concat(s)
end

function sbox_transform(v, round)
    local term1 = (v * 179 + crypto_params[(round % 16) + 1]) % 256
    local term2 = crypto_params[((v + round) % 16) + 1]
    return term1 ~ term2
end

function generate_signature(uid, nonce)
    local state = {}
    
    -- 初始化混合(处理二进制字符串输入)
    for i = 1, 12 do
        state[i] = (uid[i] ~ nonce[(i-1) % 4 + 1]) & 0xFF
    end

    -- 混淆扩散处理
    for round = 1, 32 do
        for j = 1, 12 do
            state[j] = sbox_transform(state[j], round)
        end
        
        local tmp = (state[1] ~ state[5] ~ state[9]) & 0xFF
        for j = 1, 11 do
            state[j] = (state[j+1] ~ crypto_params[(j + round) % 16 + 1]) & 0xFF
        end
        state[12] = tmp
    end

    -- 生成64位签名
    local signature = {}
    for i = 1, 8 do
        signature[i] = (state[i] ~ state[i+4]) & 0xFF
    end
    
    -- return bytes_to_str(signature)
    return signature

end

-- 测试用例
local uid = {0x1D, 0x00, 0x2E, 0x00, 0x07, 0x51, 0x33, 0x31, 0x36, 0x34, 0x39, 0x34}
local nonce = {0xcb, 0xae, 0x6d, 0x0c}

local signature = generate_signature(uid, nonce)

s =    string.char(signature[1] & 0xFF)
s = s..string.char(signature[2] & 0xFF)
s = s..string.char(signature[3] & 0xFF)
s = s..string.char(signature[4] & 0xFF)
s = s..string.char(signature[5] & 0xFF)
s = s..string.char(signature[6] & 0xFF)
s = s..string.char(signature[7] & 0xFF)
s = s..string.char(signature[8] & 0xFF)

print_hex(s)



但是在UID加密烧录界面使用以下代码来执行lua脚本,
[Lua] 纯文本查看 复制代码
-- 烧录器调用入口函数
function encrypt(_uid, _rnd)
    -- 参数有效性检查
    assert(type(_uid) == "string", "UID must be binary string")
    assert(type(_rnd) == "string", "RND must be binary string")
    assert(#_uid == 12, "UID length must be 12 bytes")
    assert(#_rnd == 4, "RND length must be 4 bytes")

    local uid = {0,0,0,0, 0,0,0,0, 0,0,0,0}
    local rnd = {}

    --将二进制的字符串转换为整数字节数组
        if (_uid == nil) then
                return
        end

        --#_uid表示字符串的长度。转换到整数数组存放
        for i = 1,#_uid,1 do
                uid[i] = tonumber(string.byte(_uid, i,i))
        end

    if (_rnd ~= nil) then
                for i = 1,#_rnd,1 do
                        rnd[i] = tonumber(string.byte(_rnd, i,i))
                end
        end

    -- 生成加密签名
    local signature = generate_signature(uid, rnd)
    
    --拼接为二进制串返回(固定16字节,存储时可以只保存4,8,12,16字节
        s =    string.char(signature[1] & 0xFF)
        s = s..string.char(signature[2] & 0xFF)
        s = s..string.char(signature[3] & 0xFF)
        s = s..string.char(signature[4] & 0xFF)
        s = s..string.char(signature[5] & 0xFF)
        s = s..string.char(signature[6] & 0xFF)
        s = s..string.char(signature[7] & 0xFF)
        s = s..string.char(signature[8] & 0xFF)

    -- 返回二进制格式结果(建议存储格式)
    return s
end


请问一下,UID加密界面里的算法该怎么调试呢?在这个encrypt函数中加入print等打印函数,也不能在信息窗口看到打印输出。
回复

使用道具 举报

26

主题

137

回帖

215

积分

高级会员

积分
215
 楼主| 发表于 2025-3-30 13:13:35 | 显示全部楼层
本帖最后由 ifree 于 2025-3-30 13:15 编辑

烧录器传给lua脚本encrypt的参数到底是怎样的呢?我把脚本内容修改为直接返回uid,如下
但是烧录过程中,看到的结果也不是uid


[Lua] 纯文本查看 复制代码
-- 烧录器调用入口函数
function encrypt(_uid, _rnd)
    -- 参数有效性检查
    assert(type(_uid) == "string", "UID must be binary string")
    assert(type(_rnd) == "string", "RND must be binary string")
    assert(#_uid == 12, "UID length must be 12 bytes")
    assert(#_rnd == 8, "RND length must be 4 bytes" .. _rnd)

    local uid = {0,0,0,0, 0,0,0,0, 0,0,0,0}
    local rnd = {}

    --将二进制的字符串转换为整数字节数组
	if (_uid == nil) then
		return
	end

	--#_uid表示字符串的长度。转换到整数数组存放
	for i = 1,#_uid,1 do
		uid[i] = tonumber(string.byte(_uid, i,i))
	end

    if (_rnd ~= nil) then
		for i = 1,#_rnd,1 do
			rnd[i] = tonumber(string.byte(_rnd, i,i))
		end
	end

    -- 生成加密签名
    -- local signature = generate_signature(uid, rnd)
    
    -- local signature = uid

    --拼接为二进制串返回(固定16字节,存储时可以只保存4,8,12,16字节
	s =    string.char(uid[1] & 0xFF)
	s = s..string.char(uid[2] & 0xFF)
	s = s..string.char(uid[3] & 0xFF)
	s = s..string.char(uid[4] & 0xFF)
	s = s..string.char(uid[5] & 0xFF)
	s = s..string.char(uid[6] & 0xFF)
	s = s..string.char(uid[7] & 0xFF)
	s = s..string.char(uid[8] & 0xFF)
	s = s..string.char(uid[9] & 0xFF)
	s = s..string.char(uid[10] & 0xFF)
	s = s..string.char(uid[11] & 0xFF)
	s = s..string.char(uid[12] & 0xFF)
	s = s..string.char(uid[13] & 0xFF)
	s = s..string.char(uid[14] & 0xFF)
	s = s..string.char(uid[15] & 0xFF)
	s = s..string.char(uid[16] & 0xFF)
    -- 返回二进制格式结果(建议存储格式)
    return s
end



[C] 纯文本查看 复制代码
-------第3步: 开始烧录-------
控制H7-TOOL进入脱机烧录界面成功
load "fix_data.lua" ok. V1.6(2022-12-05)
load "prog_lib.lua" ok. V3.8(2024-03-15)
load "machine_if.lua" ok.  V2.1(2024-04-12)
单路模式
开始烧录...
单路烧录
ST(意法半导体)	STM32H7xx	STM32H7x_2M
SWCLK时钟延迟: 	0
TVCC电压: 3.281V   TVCC电流:76mA
复位模式 = 0
出错立即中止 = 1
core_id = 0x6BA02477
SN. = 0
DateTime 2000-01-01 00:00:00
UID加密功能已启用
uid1 = 1D 00 2E 00 07 51 33 31 36 34 39 34 
42 E8 FB E5 69 BD 48 72 
------------------------
FLM : 0:/H7-TOOL/Programmer/Device/ST/STM32H7xx/FLM/STM32H7x_2M.FLM
Data: sc1000-bootloader.hex_1.bin
Addr: 0x08000000, cfg = 0
InitUnderReset()
..DeviceID = 20036450 
OK
.NVIC_CPUID = 411FC271, Cortex-M7 r1p1
正在检查空片 
  36ms, 0.00%
  40ms, 100.00%
正在擦除扇区...
  42ms, 0.00%
  872ms, 100.00%
  1709ms, 100.00%
正在编程...
  1731ms, 0.00%
......
  2403ms, 100.00%
正在校验...(FLM_CRC32)
  2407ms, 0.00%
......
  2469ms, 100.00%
编程成功

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2025-3-31 01:11:22 | 显示全部楼层

1、比如我这里操作这个copy uid 算法文件

1.png

2、打开后,简单修改下面的函数,加入个print打印,修改完毕后保存文件



2.png

3、同步到eMMC

3.png

4、测试效果

4.png

回复

使用道具 举报

26

主题

137

回帖

215

积分

高级会员

积分
215
 楼主| 发表于 2025-3-31 20:50:06 | 显示全部楼层
谢谢,最终发现这个第3步是关键操作,必须点击同步eMMC后,对脚本文件的修改才有效果。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 22:20 , Processed in 0.249592 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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