|
本帖最后由 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等打印函数,也不能在信息窗口看到打印输出。
|
|