2016-02-26 121 views
1

我對LUA毫無所知,我正在爲nginx製作一個小腳本。如何將十六進制字符串轉換爲Lua中的ascii字符串

我正在使用以下庫(https://github.com/openresty/lua-resty-string)加密一些數據。具體來說,我使用AES 256 CBC(SHA-512,salted)加密的代碼,並存儲十六進制編碼的加密字符串,如示例中所示。

現在的問題是我需要將該十六進制字符串返回到需要ASCII字符串的解密方法。

這是加密的十六進制字符串的例子:

fdbcc47fe5825d49ac3429d4f8408fa4b6528dd99d938f122ee7f00ab71ae0c5c73d29d4f54ea1fbefe706b5dca04f6b6c6b8b96d9807ef58eaba07c6c6cefaf6ad8673b43a4e243fb2912fb4ff93de6488c4795ebb09ecd7a40b7c9dc2003be4ff93425d2d74688208fa4d2a8d22f32490666550f4b01340de708d7aa5bc8468d171da400f59fcff4e7d371d7ab9b48fdfde29aefc0af78b2f934927a7713994c1e8f9435067c851efc5d300405c74d 
+0

你如何轉換爲十六進制? – warspyking

回答

2

剛把最近寫一個幾乎相同的原因。濫用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)) 
+3

爲什麼不簡單'str:gsub('%x%x',函數(c)返回c.char(tonumber(c,16))end)'? –

+0

@Egor爲什麼不簡單地'''str:gsub('%x%x',string.char(tonumber('%1',16)))'''? – warspyking

+1

@warspyking這是行不通的。 –

相關問題