【问题标题】:How to convert an hex string into ascii string in Lua如何在 Lua 中将十六进制字符串转换为 ascii 字符串
【发布时间】:2016-02-27 05:54:05
【问题描述】:

我对 LUA 一无所知,我正在尝试为 nginx 编写一个小脚本。

我正在使用以下库 (https://github.com/openresty/lua-resty-string) 来加密一些数据。具体来说,我正在使用 AES 256 CBC(SHA-512,加盐)加密的代码并存储十六进制编码的加密字符串,如示例所示。

现在的问题是我需要将该十六进制字符串返回到需要 ASCII 字符串的解密方法。

这是一个加密的十六进制字符串的例子:

fdbcc47fe5825d49ac3429d4f8408fa4b6528dd99d938f122ee7f00ab71ae0c5c73d29d4f54ea1fbefe706b5dca04f6b6c6b8b96d9807ef58eaba07c6c6cefaf6ad8673b43a4e243fb2912fb4ff93de6488c4795ebb09ecd7a40b7c9dc2003be4ff93425d2d74688208fa4d2a8d22f32490666550f4b01340de708d7aa5bc8468d171da400f59fcff4e7d371d7ab9b48fdfde29aefc0af78b2f934927a7713994c1e8f9435067c851efc5d300405c74d

【问题讨论】:

  • 你是如何转换成十六进制的?

标签: string encryption nginx lua


【解决方案1】:

最近因为几乎相同的原因不得不写一个。滥用gsub - 捕获每两个字符并用 hexnumber->character map 中预先计算的值替换它们。

-- Needs to be only done once
local hex_to_char = {}
for idx = 0, 255 do
    hex_to_char[("%02X"):format(idx)] = string.char(idx)
    hex_to_char[("%02x"):format(idx)] = string.char(idx)
end

-- Sometime later
str = "fdbcc47fe5825d49ac3429d4f8408fa4b6528dd99d938f122ee7f00ab71ae0c5c73d29d4f54ea1fbefe706b5dca04f6b6c6b8b96d9807ef58eaba07c6c6cefaf6ad8673b43a4e243fb2912fb4ff93de6488c4795ebb09ecd7a40b7c9dc2003be4ff93425d2d74688208fa4d2a8d22f32490666550f4b01340de708d7aa5bc8468d171da400f59fcff4e7d371d7ab9b48fdfde29aefc0af78b2f934927a7713994c1e8f9435067c851efc5d300405c74d"
print(str:gsub("(..)", hex_to_char))

【讨论】:

  • 为什么不简单地str:gsub('%x%x',function(c)return c.char(tonumber(c,16))end)
  • @Egor 为什么不简单地str:gsub('%x%x',string.char(tonumber('%1',16)))
  • @warspyking 立即计算表达式。它尝试执行 tonumber("%1) 失败。
  • @Colon 我认为“%1”是第一次捕获..?
  • @Egor,因为我不希望每两个符号额外调用 3 个函数。
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2014-11-16
  • 2013-02-07
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多