纯lua实现Base64加密与解密

--Lua--十进制转二进制
function dec_to_binary (data)
    local dst = ""
    local remainder, quotient

    --异常处理
    if not data then return dst end                            --源数据为空
    if not tonumber(data) then return dst end       --源数据无法转换为数字

    --如果源数据是字符串转换为数字
    if "string" == type(data) then
        data = tonumber(data)
    end

    while true do
        quotient = math.floor(data / 2)
        remainder = data % 2
        dst = dst..remainder
        data = quotient
        if 0 == quotient then
            break
        end
    end

    --翻转
    dst = string.reverse(dst)

    --补齐8位
    if 8 > #dst then
        for i = 1, 8 - #dst, 1 do
            dst = ‘0‘..dst
        end
    end
    return dst
end

--Lua--二进制转十进制
function binary_to_dec (data)
    local dst = 0
    local tmp = 0

    --异常处理
    if not data then return dst end                            --源数据为空
    if not tonumber(data) then return dst end       --源数据无法转换为数字

    --如果源数据是字符串去除前面多余的0
    if "string" == type(data) then
        data = tostring(tonumber(data))
    end

    --如果源数据是数字转换为字符串
    if "number" == type(data) then
        data = tostring(data)
    end

    --转换
    for i = #data, 1, -1 do
        tmp = tonumber(data:sub(-i, -i))
        if 0 ~= tmp then
            for j = 1, i - 1, 1 do
                tmp = 2 * tmp
            end
        end
        dst = dst + tmp
    end
    return dst
end

--Lua--base64加密
function base64encode(data)
    local basecode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    local code = ""
    local dst = ""
    local tmp
    local encode_num = 0            --base64编码后的分组数,6字节为一组
    local num = 0                            --编码后后缀"="的个数
    local len = 1                               --用于统计编码个数,76个编码字符换行

    --异常处理
    if not data then return dst end                 --源数据为空

    --转换为二进制
    for i = 1, #data, 1 do
        tmp = data:byte(i)
        if 0 > tmp or 255 < tmp then
            return dst
        end
        code = code..dec_to_binary(tmp)
    end

    --字符串长度不能被3整除的情况
    num = 3 - #data % 3
    if 0 < num then
        for i = 1, num, 1 do
            code = code.."00000000"
        end
    end

    encode_num = #code / 6

    --开始编码
    for i = 1, #code, 6 do
        tmp = binary_to_dec(code:sub(i, i + 5))
        tmp = tmp + 1                                                       --Lua下标从1开始,切记

        if 0 == num then                                                   --无"="后缀的情况
            dst = dst..basecode:sub(tmp, tmp)
            len = len + 1
            encode_num = encode_num - 1
            --每76个字符换行
            if 76 == len then
                dst = dst.."\n"
                len = 1
            end
        end

        if 0 < num then                                                         --有"="后缀的情况
            if encode_num == num and 1 == tmp then
                dst = dst..‘=‘
                len = len + 1
                encode_num = encode_num - 1
                num = num - 1
                --每76个字符换行
                if 76 == len then
                    dst = dst.."\n"
                    len = 1
                end
        else
            dst = dst..basecode:sub(tmp, tmp)
            len = len + 1
            encode_num = encode_num - 1
            --每76个字符换行
            if 76 == len then
                dst = dst.."\n"
                len = 1
            end
        end
        end
    end
    return dst
end

--Lua--base64解密
function base64decode(data)
    local basecode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    local dst = ""
    local code = ""
    local tmp, index

    --异常处理
    if not data then return dst end                   --源数据为空

    data = data:gsub("\n", "")                              --去除换行符
    data = data:gsub("=", "")                               --去除‘=‘

    for i = 1, #data, 1 do
        tmp = data:sub(i, i)
        index = basecode:find(tmp)
        if nil == index then
            return dst
        end
        index = index - 1
        tmp = dec_to_binary(index)
        code = code..tmp:sub(3)                           --去除前面多余的两个‘00‘
    end

    --开始解码
    for i = 1, #code, 8 do
        tmp = string.char(binary_to_dec(code:sub(i, i + 7)))
        if nil ~= tmp then
            dst = dst..tmp
        end
    end
    return dst
end
时间: 2024-09-27 20:31:01

纯lua实现Base64加密与解密的相关文章

lua之base64加密和解密算法。

local function encodeBase64(source_str) local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' local s64 = '' local str = source_str while #str > 0 do local bytes_num = 0 local buf = 0 for byte_cnt=1,3 do buf = (buf * 256

C#中的实现 base64加密和解密

首先是加密 byte[] bytes = Encoding.Default.GetBytes("要转换的字符"); string str = Convert.ToBase64String(bytes); 然后是解密 byte[] outputb = Convert.FromBase64String(str); string orgStr = Encoding.Default.GetString(outputb);   C#中的实现 base64加密和解密

JS URL 使用base64加密与解密

JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3school.com.cn/My first/")+ "<br />")//编译 document.write(decodeURI("http://www.w3school.com.cn/My first/")+ "<br />

Java Base64加密、解密原理Java代码

Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为

js中实现base64加密、解密

//1.加密解密方法使用: //1.加密 var str = '124中文内容'; var base = new Base64(); var result = base.encode(str); //document.write(result); //2.解密 var result2 = base.decode(result); document.write(result2); //2.加密.解密算法封装: function Base64() { // private property _key

Base64加密与解密

Base64加密方式是将原文经过简单的字符转换,转换成不easy被肉眼看出的字符编码.Base64加密经常使用在HTTP环境下传递较长的标识信息确保不破坏HTTP的请求格式,Base64的加密原理是将3个8位二进制转换为4个6位二进制,不足6位时高位补0 .以确保其值为64个可能,这就是Base64来源. 例如以下图就是Base64标准中的编码表. 取个样例: 须要加密的原文是"ABC"这三个字母,通过ASCII表得到这个三个字母的值的二进制表示为(去查ASCII表): 字符A:010

字符串base64加密、解密

//base64加密(字符串经过base64加密之后得到的新的字符串)NSData *data = [@"iOS Developer Tips" dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64Encoded = [data base64EncodedStringWithOptions:0]; //base64解密(base64加密的字符串经过base64解密之后得到的新的字符串) NSData *nsdataDecod

base64 加密原理 解密原理

假设需要加密的字符串是Jasmine 具体转换步骤: 第一步 将待转换的字符串转为一个个字符第二步 计算每一个字符对应的ASCII码十进制第三步 计算出十进制对应的二进制,若不足8位,在前面添加0进行补全第四步 将8位的二进制码,按照6个6个一组划分,若不能整除6,在最末添加0补足6位第五步 计算对应的十进制编码第六步 按照base64表,查看对应的字符第七步 将加密后的字符3个3个分成一组,不足3位的添加=进行补全第八步 得到最终结果 同时得到base64位加密后的特征:长度是3的倍数只含有6

JS base64 加密和解密

/*** * 加密 base64encode(utf16to8(str)) * 解密 utf8to16(base64decode(str)) * * */ var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -