lua实现xxTea加解密

还是直接上代码吧~




function _long2str(v, w)
    local len = #v


    local n = bit.lshift((len - 1) , 2)
    if (w) then
        local m = v [len]
        if ((m < n - 3) or (m > n)) then
        return false
        end
        n = m
    end
    local s = {}
    for i = 1 , len do
        s [i] = string.packL(v[i])
    end


    if (w) then
        return string.sub(table.concat(s, ''), 0, n)
    else
        return table.concat(s, '')
    end
end
function _str2long(s, w)
    local v = string.unpackL(s .. string.rep("\0", (4 - bit.band((string.len(s) % 4)  , 3))))
    if (w) then
        v [#v+1] = string.len(s)
    end
    return v
end
function _int32(n)
    while (n >= 2147483649) do
        n = n - 4294967296
    end
    while (n <= -2147483649) do
        n = n + 4294967296
    end
    return n
end


function security.xxTEAEncrypt(str, key, toBase64)


    toBase64 = toBase64 or true
    if (str == "") then
        return ""
    end
    local v = _str2long(str, true)
    local k = _str2long(key, false)


    if (#k < 4) then
        for i = #k+1, 4, 1  do
        k [i] = 0
        end
    end
    local n = #v
    local z = v [n]
    local y = v [1]
    local delta = -0x61C88647
    local q = math.floor(6 + 52 / (n)) --设定加密轮数
    local sum = 0


    while 0 < q do
        q = q -1
        sum = _int32(sum + delta)
        e = bit.band(bit.rshift(sum , 2), 3)
        local p = 0
        for p = 0, n-2 do
        y = v [p + 2]
            mx = bit.bxor(_int32(bit.bxor(bit.band(bit.rshift(z, 5), 0x07ffffff), bit.lshift(y , 2)) + bit.bxor(bit.band(bit.rshift(y, 3), 0x1fffffff), bit.lshift(z, 4))), _int32(bit.bxor(sum, y) + bit.bxor(k[bit.bxor(bit.band((p), 3), e)+1], z)))
            z  = _int32(v[p+1] + mx)
            v [p+1]  = z
        end


        p = #v - 1
        y = v [1]
        mx = bit.bxor(_int32(bit.bxor(bit.band(bit.rshift(z, 5), 0x07ffffff), bit.lshift(y , 2)) + bit.bxor(bit.band(bit.rshift(y, 3), 0x1fffffff), bit.lshift(z, 4))), _int32(bit.bxor(sum, y) + bit.bxor(k[bit.bxor(bit.band((p), 3), e)+1], z)))
        z = _int32(v[n] + mx)
        v [n] = z


    end
    if (toBase64) then
        local r = security.url_safe_base64_encode(_long2str(v, false))
        return r
    end
    return _long2str(v, false)
end
function security.xxTEADecrypt(str, key, toBase64)


    toBase64 = toBase64 or true


    if (str == "") then
        return ""
    end
    -- 	logcat(str)
    if toBase64 then
        str = security.url_safe_base64_decode(str)
    end


    local v = _str2long(str, false)
    local k = _str2long(key, false)
    if (#k < 4) then
        for i = #k+1, 4, 1  do
            k [i] = 0
        end
    end


    local n = #v - 1
    local z = v [n]
    local y = v [1]
    local delta = -0x61C88647
    local q = math.floor(6 + 52 / (n+1)) --设定加密轮数
    local sum = _int32(q * delta)
    while (sum ~= 0) do
        e = bit.band(bit.rshift(sum , 2), 3)
--         		test_result = test_result .."e: "..e.."\n"
--         		logcat ("e: "..e)
        local p = n 
        for p = n, 1, -1 do
			
            z = v [p]
--             			test_result = test_result .."z: "..z.."p-1: "..(p-1).."\n"
--             			logcat ("z: "..z.."p-1: "..p-1)
--             			test_result = test_result .."y: "..y.."\n"
--             			logcat ("y: "..y)
--             			test_result = test_result .."p: "..p.."\n"
--             			logcat ("p: "..p)
--             			test_result = test_result .."k: "..(k[bit.bxor(bit.band((p), 3), e)+1]).."\n"
--             			logcat ("k: "..k[bit.bxor(bit.band((p), 3), e)+1])
            mx = bit.bxor(_int32(bit.bxor(bit.band(bit.rshift(z, 5), 0x07ffffff), bit.lshift(y , 2)) + bit.bxor(bit.band(bit.rshift(y, 3), 0x1fffffff), bit.lshift(z, 4))), _int32(bit.bxor(sum, y) + bit.bxor(k[bit.bxor(bit.band((p), 3), e)+1], z)))
--             			test_result = test_result .."mx: "..mx.."\n"
--             			logcat ("mx: "..mx)
            y  = _int32(v [p+1] - mx)
--                         test_result = test_result .."y: "..y.."p: "..p.."\n"
--             			logcat ("y: "..y.."p: "..p)
            v [p+1] = y


        end


        p = 0
        z = v[n+1]
--                 test_result = test_result .."z2: "..z.."\n"
--         		logcat ("z2: "..z)
        mx = bit.bxor(_int32(bit.bxor(bit.band(bit.rshift(z, 5), 0x07ffffff), bit.lshift(y , 2)) + bit.bxor(bit.band(bit.rshift(y, 3), 0x1fffffff), bit.lshift(z, 4))), _int32(bit.bxor(sum, y) + bit.bxor(k[bit.bxor(bit.band((p), 3), e)+1], z)))
--                 test_result = test_result .."mx2: "..mx.."\n"
--         		logcat ("mx2: "..mx)
        y = _int32(v[1] - mx)
--         		test_result = test_result .."y2: "..y.."\n"
--         		logcat ("y2: "..y)
        v [1] = y
        sum = _int32(sum - delta)
    end


    return _long2str(v, true)
end


PS: 由于不是纯LUA代码(为Xscript LUA脚本代码),所以需要修改部分代码才可以运行,需注意。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Lua游戏客户端加解密是指在游戏客户端中使用Lua程序对游戏数据进行加密解密的方法。这种加解密方法通常用于保护游戏数据的安全性,以防止游戏数据被恶意攻击者窃取。 在实现Lua游戏客户端加解密的过程中,可以采用各种不同的加密算法,如DES、AES等。这些算法可以保证游戏数据在传输过程中的安全性,防止数据被拦截、篡改、窃取等恶意行为。同时,加密算法还可以在服务器端对游戏数据进行解密,保证数据的一致性和正确性。 需要注意的是,Lua游戏客户端加解密需要谨慎使用,因为过于复杂的加密算法可能导致游戏客户端程序变得过重和过慢,从而影响游戏的体验。因此,在应用加密算法时需要平衡安全性和性能,尽可能保证游戏客户端的流畅性和稳定性。 ### 回答2: 对于lua游戏客户端加解密,我们可以采用对称加密算法进行处理。常用的对称加密算法有DES、AES等。在使用加密算法之前,我们需要先生成一个密钥。生成密钥的方法可以是手动输入或者自动随机生成。对于手动输入的密钥,可以通过开发者在游戏代码中指定密钥的方式进行,而对于自动生成的密钥,可以采用一些加密算法来生成。 在游戏代码中,我们可以在需要加密的地方调用加密函数,将需要加密的数据和密钥传入加密函数中,加密函数会针对数据和密钥进行处理,并返回加密后的数据。解密也是类似的过程,只是需要调用解密函数并传入密文和密钥。 除了对数据进行加解密处理之外,为了增强加密的安全性,我们还可以对加密后的数据进行编码。常用的编码方式有base64、hex等,这样做可以增强数据的混淆度,防止黑客进行猜解。 当然,在进行加解密处理时,需要注意的是密钥的安全性问题。密钥一旦被泄露,整个加密系统将失去其安全性。因此,在游戏代码中,开发人员应该将密钥进行封装,仅提供给有权限的用户来进行使用,防止密钥被泄露。同时,还需要定期更换密钥,以增强加密的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值