开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 269|回复: 2
收起左侧

[已解决] 求大佬将这个JS加解密函数翻译成LUA

 关闭 [复制链接]
结帖率:100% (19/19)
发表于 2024-10-4 12:19:22 | 显示全部楼层 |阅读模式   辽宁省大连市
100精币
[JavaScript] 纯文本查看 复制代码
function (str, operation, key, expiry) {
    var operation = operation ? operation : 'DECODE';
    var key = key ? key : '';
    var expiry = expiry ? expiry : 0;

    var ckey_length = 4;
    key = md5(key);

    // 密匙a会参与加解密
    var keya = md5(key.substr(0, 16));
    // 密匙b会用来做数据完整性验证
    var keyb = md5(key.substr(16, 16));
    // 密匙c用于变化生成的密文
    // IE下不支持substr第一个参数为负数的情况
    if (ckey_length) {
        if (operation == 'DECODE') {
            var keyc = str.substr(0, ckey_length);
        } else {
            var md5_time = md5(microtime());
            var start = md5_time.length - ckey_length;
            var keyc = md5_time.substr(start, ckey_length)
        }
    } else {
        var keyc = '';
    }
    // 参与运算的密匙
    var cryptkey = keya + md5(keya + keyc);

    var strbuf;

    if (operation == 'DECODE') {
        str = str.substr(ckey_length);
        strbuf = base64_decode(str);
        //string = b.toString();
    } else {
        expiry = expiry ? expiry + time() : 0;
        tmpstr = expiry.toString();
        if (tmpstr.length >= 10) str = tmpstr.substr(0, 10) + md5(str + keyb).substr(0, 16) + str;
        else {
            var count = 10 - tmpstr.length;
            for (var i = 0; i < count; i++) {
                tmpstr = '0' + tmpstr;
            }
            str = tmpstr + md5(str + keyb).substr(0, 16) + str;
        }
        strbuf = str;
    }

    var box = new Array(256);
    for (var i = 0; i < 256; i++) {
        box = i;
    }
    var rndkey = new Array();
    // 产生密匙簿
    for (var i = 0; i < 256; i++) {
        rndkey = cryptkey.charCodeAt(i % cryptkey.length);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for (var j = i = 0; i < 256; i++) {
        j = (j + box + rndkey) % 256;
        tmp = box;
        box = box[j];
        box[j] = tmp;
    }

    // 核心加解密部分
    var s = '';
    //IE下不支持直接通过下标访问字符串的字符,需要先转换为数组
    strbuf = strbuf.split('');
    for (var a = j = i = 0; i < strbuf.length; i++) {
        a = (a + 1) % 256;
        j = (j + box[a]) % 256;
        tmp = box[a];
        box[a] = box[j];
        box[j] = tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        s += chr(ord(strbuf) ^ (box[(box[a] + box[j]) % 256]));
    }

    if (operation == 'DECODE') {
        if ((s.substr(0, 10) == 0 || s.substr(0, 10) - time() > 0) && s.substr(10, 16) == md5(s.substr(26) + keyb).substr(0, 16)) {
            s = s.substr(26);
        } else {
            s = '';
        }
    } else {
        s = base64_encode(s);
        var regex = new RegExp('=', "g");
        s = s.replace(regex, '');
        s = keyc + s;
    }

    return s;
}



求大佬将这个JS加解密函数翻译成LUA


补充内容 (2024-10-5 07:48):
https://github.com/qiqizjl/lua-resty-authcode/tree/master

最佳答案

查看完整内容

md5、base64库自己找下 [mw_shl_code=javascript,true] -- LuaRocks安装lua-resty-string 实现 md5 base64 local md5 = require("resty.string").to_hex(require("resty.hash").md5) local base64_encode, base64_decode = require("resty.string").to_base64, require("resty.string").from_base64 function encrypt_decrypt(str, operation, key, expiry) operation = operation or 'DECODE' key = key or '' ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

签到天数: 22 天

发表于 2024-10-4 12:19:23 | 显示全部楼层   广东省广州市
md5、base64库自己找下
[JavaScript] 纯文本查看 复制代码
 -- LuaRocks安装lua-resty-string 实现 md5 base64
local md5 = require("resty.string").to_hex(require("resty.hash").md5)  
local base64_encode, base64_decode = require("resty.string").to_base64, require("resty.string").from_base64  
  
function encrypt_decrypt(str, operation, key, expiry)  
    operation = operation or 'DECODE'  
    key = key or ''  
    expiry = expiry or 0  
  
    local ckey_length = 4  
    key = md5(key)  
  
    -- 密匙a会参与加解密  
    local keya = md5(string.sub(key, 1, 16))  
    -- 密匙b会用来做数据完整性验证  
    local keyb = md5(string.sub(key, 17, 32))  
    -- 密匙c用于变化生成的密文  
    local keyc  
    if ckey_length then  
        if operation == 'DECODE' then  
            keyc = string.sub(str, 1, ckey_length)  
        else  
            local md5_time = md5(os.time() * 1000)  -- Lua没有microtime,使用os.time()代替  
            local start = #md5_time - ckey_length + 1  
            keyc = string.sub(md5_time, start, start + ckey_length - 1)  
        end  
    else  
        keyc = ''  
    end  
  
    local cryptkey = keya .. md5(keya .. keyc)  
  
    local strbuf  
  
    if operation == 'DECODE' then  
        str = string.sub(str, ckey_length + 1)  
        strbuf = base64_decode(str)  
    else  
        expiry = expiry and os.difftime(os.time(), -expiry) or 0  
        local tmpstr = tostring(expiry)  
        if #tmpstr >= 10 then  
            str = string.sub(tmpstr, 1, 10) .. string.sub(md5(str .. keyb), 1, 16) .. str  
        else  
            local count = 10 - #tmpstr  
            for i = 1, count do  
                tmpstr = '0' .. tmpstr  
            end  
            str = tmpstr .. string.sub(md5(str .. keyb), 1, 16) .. str  
        end  
        strbuf = str  
    end  
  
    local box = {}  
    for i = 0, 255 do  
        box[i + 1] = i + 1  
    end  
  
    local rndkey = {}  
  
    for i = 0, 255 do  
        rndkey[i + 1] = string.byte(cryptkey, (i + 1) % #cryptkey + 1)  
    end  
  
   
    for j, i = 0, 256 do  
        j = (j + box[i + 1]) % 256 + 1  
        box[i + 1], box[j] = box[j], box[i + 1]  
    end  
  
    -- 核心加解密部分  
    local s = ''  
    for a, i = 0, #strbuf do  
        a = (a + 1) % 256 + 1  
        j = (j + box[a]) % 256 + 1  
        box[a], box[j] = box[j], box[a]  
        s = s .. string.char(string.byte(strbuf, i + 1) ~ (box[(box[a] + box[j] - 2) % 256 + 1]))  
    end  
  
    if operation == 'DECODE' then  
        local time_check = tonumber(string.sub(s, 1, 10))  
        if time_check == 0 or os.difftime(os.time(), -time_check) > 0 and string.sub(s, 11, 26) == string.sub(md5(string.sub(s, 27)), 1, 16) then  
            s = string.sub(s, 27)  
        else  
            s = ''  
        end  
    else  
        s = base64_encode(s):gsub("=", "")  
        s = keyc .. s  
    end  
  
    return s  
end  
  
-- print(encrypt_decrypt("your_string", "ENCODE", "your_key", 3600))  
-- print(encrypt_decrypt(result_from_above_call, "DECODE", "your_key", 0))

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:50% (2/4)

签到天数: 22 天

发表于 2024-10-4 13:26:36 | 显示全部楼层   福建省厦门市
这不是dz的authcode么~

github找一下就有了

评分

参与人数 1好评 +1 精币 +2 收起 理由
yuan71058 + 1 + 2 很赞同,谢谢!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表