function encode(data)
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
return ((data:gsub('.', function(x)
local r,b='',x:byte()
for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
return r;
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then return '' end
local c=0
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
return b:sub(c+1,c+1)
end)..({ '', '==', '=' })[#data%3+1])
function decode(data)
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
data = string.gsub(data, '[^'..b..'=]', '')
return (data:gsub('.', function(x)
if (x == '=') then return '' end
local r,f='',(b:find(x)-1)
for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
return r;
end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
if (#x ~= 8) then return '' end
local c=0
for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
return string.char(c)
end))
local sourceStr = "evertyDay_Login_refresh#1#true#false#0#nil#100"
print("------ sourceStr:", sourceStr)
local newStr = encode(sourceStr)
print("------ newStr:", newStr)
local soureStr = decode(newStr)
print("------ sourceStr:", sourceStr)
可以用在cocos2d-lua内的本地存储,增加数据安全性。
Lua是一种轻量级的嵌入式脚本语言,由巴西里约热内卢天主教大学的Roberto Ierusalimschy等人开发。Lua设计简洁,易于嵌入到C/C++程序中。轻量级:Lua的核心库很小,代码体积小,运行速度快。嵌入性强:Lua可以很容易地嵌入到C/C++程序中,并且可以通过C API与宿主程序进行交互。灵活性高:Lua的动态类型和自动内存管理特性,使其在开发中非常灵活。LUAC是Lua的字节码编译器,可以将Lua源代码编译成二进制字节码文件。
print ("Base64 编码后的字符串:", encoded_string)local long_string = "这是一个需要编码的长字符串。-- Base64 编码函数。-- Base64 字符表。-- 要编码的字符串。
Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输。由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下就可以了
将文件读入内存,由于读入内存的文件本质上是一个字节类型数组bufferA,新建一个bufferB,对数组A中连续的每三个字节值取出,将其编程四个字节,不够的高位补0,对于最后组不成三个字节的处理,少一个就补一个=,最多补两个==;
举例:加密“ace”,
ace转化为二进制为:01100001 01100011 011001
前段时间博猪要处理图片上传,经过一段时间的研究,借鉴了一下别人的思路,通过把图片处理成base64再通过http协议就可以完成。首先,读取图片:function ReadFileToByte() --读取图片文件到内存 local f = io.open("..\..\..\..\","rb") local retbyte = f:read("*all") f:close()--处理retybe并...
由于涉及到java 与 lua 之间传递字节数组,如果直接传递的话会导致json解析失败,所以需要将字节数组加密为字符串,这样可以保证数据的完整传输。
在网上找到了多个版本的lua base64的编解码代码,经过逐个测试最终方案3解决了我的问题。
调用decodeBase64解码测试的时候经常返回nil值
参考:http://www.cnblogs.com/decode1234/p...
-- 编码function encodeBase64(source_str) local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' local s64 = '' local str = source_str while #str > 0...
local function encodeBase64(source_str)
local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
local s64 = ''
local str = source_str
while #str > 0 do
这里有个小技巧,当有很多so文件的时候,一般最大的文件是我们的目标(文件大是因为集成了lua引擎)。其中lua是明文代码,直接用记事本就能打开,luac是lua编译后的字节码,文件头为0x1B 0x4C 0x75 0x61 0x51,lua虚拟机能够直接解析lua和luac脚本文件,而luaJIT是另一个lua的实现版本(不是原作者写的),JIT是指Just-In-Time(即时解析运行),luaJIT相比lua和luac更加高效,文件头是0x1B 0x4C 0x4A。
进入关键函数Lua_loader_buffer首先判断第一个字符为=
之后根据base64解码表映射解密base64,其中将第一个字符替换为0x1d,即为0x1d+0x2b=H
解码base64后的结果如下所示
如果第一个字符为0x1c进行异或解密
最后再将第一个字符0x1c替换为0x78,进行inflate解码,解码完成后将第一个字符替换为28(0x1c)
解密算法如下
import base64
import base64
import zlib
fp=open("main.lua","rb")