ROBLOX Lua 的轻量级加密公式

在 ROBLOX 的一个项目中,我正在寻找一种纯 Lua 的轻量级加密算法,它可以使用密钥快速加密和解密字符串。我一直在寻找,大多数解决方案需要实现 C 库,或者对我寻找的东西来说太重了。我不太了解加密,但它不应该是非常明显的,但也不应该太复杂。是否有一个我在某些方面错过了的库,可以解决这个问题呢?

点赞
用户33252
用户33252

Lua加密程序

plc上有一组纯Lua加密程序,但这些程序使用Lua 5.3,而ROBLOX使用的是Lua 5.1.x。

Lua 5.3的优点在于它包含了位操作运算符。在5.3之前,Lua需要外部库来进行位操作。[好吧,其实也有用math函数进行位操作的纯Lua库,比如lua-bit-numberlua,但5.3是这种程序的第一个实用版本。]Lua 5.3还支持64位整数,而先前的版本仅支持双精度浮点数(53位整数)。

当然可以使用32位整数在Lua 5.1中实现加密。最容易的起点是一个简单的置换密码

一个更有趣且适合实现的密码可能是solitaire

2016-03-01 20:52:58
用户1847592
用户1847592

这是一个轻量级的纯 Lua 加密算法的例子。

它可以在 Lua 5.1、5.2 和 5.3 上运行,无需外部库。

do
  -- 这是您的秘密 67 位密钥(随机位数即可)
  local Key53 = 8186484168865098
  local Key14 = 4887

  local inv256

  function encode(str)
    if not inv256 then
      inv256 = {}
      for M = 0, 127 do
        local inv = -1
        repeat inv = inv + 2
        until inv * (2*M + 1) % 256 == 1
        inv256[M] = inv
      end
    end
    local K, F = Key53, 16384 + Key14
    return (str:gsub('.',
      function(m)
        local L = K % 274877906944  -- 2^38
        local H = (K - L) / 274877906944
        local M = H % 128
        m = m:byte()
        local c = (m * inv256[M] - (H - M) / 128) % 256
        K = L * F + H + c + m
        return ('%02x'):format(c)
      end
    ))
  end

  function decode(str)
    local K, F = Key53, 16384 + Key14
    return (str:gsub('%x%x',
      function(c)
        local L = K % 274877906944  -- 2^38
        local H = (K - L) / 274877906944
        local M = H % 128
        c = tonumber(c, 16)
        local m = (c + (H - M) / 128) * (2*M + 1) % 256
        K = L * F + H + c + m
        return string.char(m)
      end
    ))
  end
end

local s = 'Hello world'
print(       encode(s) ) --> 80897dfa1dd85ec196bc84
print(decode(encode(s))) --> Hello world
2016-03-01 23:22:54
用户3979429
用户3979429

最佳的加密方式是你自己的加密方式。尝试使用独特的加密算法,这样别人就更难猜测。

2016-03-02 14:14:58