这是一个使用 Lua 语言编写的文件和文件夹加密解密脚本,提供了简单易用的加密功能,并支持对文件夹内的所有文件进行批量操作。

加密过程:

  1. 定义了一个加密密钥 my_key,是一个数字。
  2. 使用 enc_file 函数对文件进行加密。首先读取文件的前 1024 个字节作为文件头,然后使用 enc_str 函数对文件头进行加密。加密算法为将每个字符的 ASCII 值加上文件长度和索引值以及密钥 my_key 并取模 256,然后将加密后的文件头写回文件。
  3. 使用 enc_name 函数对文件名进行加密,加密算法为将每个字符的 ASCII 值取模 256 后转为 16 进制,并将空格替换为加号。
  4. 使用 os.rename 函数将文件名加上 .lock 后缀。

解密过程:

  1. 使用 dec_file 函数对文件进行解密。首先读取文件的前 1024 个字节作为文件头,然后使用 dec_str 函数对文件头进行解密。解密算法为将每个字符的 ASCII 值减去文件长度和索引值以及密钥 my_key 并取模 256,然后将解密后的文件头写回文件。
  2. 使用 dec_name 函数对文件名进行解密,解密算法为将每两个字符转为 10 进制后取模 256 并转为对应的字符。
  3. 使用 os.rename 函数将文件名去掉 .lock 后缀。

其他函数:

  1. getpathes 函数用于递归获取文件夹下的所有文件路径。
  2. is_dir 函数判断给定的路径是否为文件夹。
  3. get_path 函数获取文件所在的文件夹路径。
  4. get_name 函数获取文件名。
  5. dc_file 函数根据文件的 .lock 后缀判断是加密还是解密,然后调用对应的函数进行加密或解密,并将文件名修改为加密或解密后的文件名。
  6. dc_path 函数根据给定的路径判断是文件还是文件夹,如果是文件夹则递归处理文件夹下的所有文件。

脚本的使用方式为将需要加密或解密的文件或文件夹拖拽到脚本上运行。

--作者 清歌拾贝 bilibili:https://space.bilibili.com/3493272800463371
--定义自己解密的key,数字
my_key = 123456

--加密文件
function enc_file(filename)
	local function enc_str(str)
		local res={}
		for i=1,#str do
			res[i]=string.char((string.byte(str,i)+#str+i+my_key)%256)
		end
		return table.concat(res)
	end

	local file=io.open(filename,"rb+")
	if file==nil then return "打开文件失败" end
	local old_head,err=file:read(1024) 
	if old_head==nil then return "读取文件头失败" end
	local new_head=enc_str(old_head)
	file:seek("set")
	file:write(new_head)
	file:close()
	return "已加密:"..filename
end

--解密文件
function dec_file(filename)
    local function dec_str(str)
        local res={}
        for i=1,#str do
            res[i]=string.char((256000+string.byte(str,i)-#str-i-my_key%256)%256)
        end
        return table.concat(res)
    end

    local file=io.open(filename,"rb+")
    if file==nil then return "打开文件失败" end
    local old_head,err=file:read(1024) 
    if old_head==nil then return "读取文件头失败" end
    local new_head=dec_str(old_head)
    file:seek("set")
    file:write(new_head)
    file:close()
    return "已解密:"..filename
end

--读取文件夹-获取文件列表
function getpathes(rootpath, pathes)
    pathes = pathes or {}
    for entry in lfs.dir(rootpath) do
        if entry ~= '.' and entry ~= '..' then
            local path = rootpath .. '\' .. entry
            local attr = lfs.attributes(path)
            assert(type(attr) == 'table')
            
            if attr.mode == 'directory' then
                getpathes(path, pathes)
            else
                table.insert(pathes, path)
            end
        end
    end
    return pathes
end

--加密文件名
function enc_name(BDsh)
	return BDsh:gsub(".", function(jia)
		return string.format("%02X", (string.byte(jia)) % 256)
	end):gsub(" ", "+")
end

--解密文件名
function dec_name(BDsh)
	if BDsh:find(".", 1, true) then return BDsh end
	return BDsh:gsub('..', function (DZSH)
		return string.char((tonumber(DZSH,16))%256)
	end)
end

--判断是否文件夹
function is_dir(path)
    return path:sub(-1) == "/" or lfs.attributes(path, "mode") == "directory"
end

--获取文件夹 
function get_path(filename)  
	return string.match(filename, "(.+)\[^\]*%.%w+$")
end

--获取文件名  
function get_name(filename)  
	return string.match(filename, ".+\([^\]*%.%w+)$")
end

--加密或解密文件
is_dec=0
function dc_file(file,ts)
    local lock=".lock"
		if ts==nil then ts="" end
    if file:sub(-#lock)==lock then --解密
			if is_dec==2 then return end
			is_dec=1
			print(ts..dec_file(file))
			local name=get_name(file)
			local newpath=get_path(file).."/"..dec_name(name:sub(1,#name-#lock))
        os.rename(file,newpath)
    else --加密
			if is_dec==1 then return end
			is_dec=2
			print(ts..enc_file(file))
			local newpath=get_path(file).."/"..enc_name(get_name(file))..lock
        os.rename(file,newpath)
    end
end

--加密或解密文件及文件夹
function dc_path(path)
    if is_dir(path) then 
		print("正在读取文件夹>>>")
		local dir_arr=getpathes(path)
		print("完毕:共"..#dir_arr.."个文件")
		local o_time = os.clock()
		print("读取耗时"..o_time-s_time.."秒")
		print("任务开始...")
        for i, v in ipairs(dir_arr) do
            dc_file(v,i.."/"..#dir_arr)
        end
    else
        dc_file(path)
    end
end


s_time = os.clock()
local path=arg[1]
if path==nil then print("请拖拽一个文件或文件夹到本程序") 
   path= io.read("*l")
end

print("--开始--")
dc_path(path)
local e_time = os.clock()
print("总计耗时"..e_time-s_time.."秒")
print("--结束--")
os.exit()

--[[
V4 加解密计时
V3 文件夹加密或解密
V2 文件夹加解密反向
V1 单文件加解密
]]

中文注释分析加密流程内容:

该脚本实现了文件和文件夹的加密和解密功能。

加密过程:

  1. 定义了一个加密的密钥 my_key,为一个数字。
  2. 使用 enc_file 函数对文件进行加密。首先读取文件的前 1024 个字节作为文件头,然后使用 enc_str 函数对文件头进行加密,加密算法为将每个字符的 ASCII 值加上文件长度和索引值以及密钥 my_key 并取模 256,然后将加密后的文件头写回文件。
  3. 使用 enc_name 函数对文件名进行加密,加密算法为将每个字符的 ASCII 值取模 256 后转为 16 进制,并将空格替换为加号。
  4. 使用 os.rename 函数将文件名加上 .lock 后缀。

解密过程:

  1. 使用 dec_file 函数对文件进行解密。首先读取文件的前 1024 个字节作为文件头,然后使用 dec_str 函数对文件头进行解密,解密算法为将每个字符的 ASCII 值减去文件长度和索引值以及密钥 my_key 并取模 256,然后将解密后的文件头写回文件。
  2. 使用 dec_name 函数对文件名进行解密,解密算法为将每两个字符转为 10 进制后取模 256 并转为对应的字符。
  3. 使用 os.rename 函数将文件名去掉 .lock 后缀。

其他函数:

  1. getpathes 函数用于递归获取文件夹下的所有文件路径。
  2. is_dir 函数判断给定的路径是否为文件夹。
  3. get_path 函数获取文件所在的文件夹路径。
  4. get_name 函数获取文件名。
  5. dc_file 函数根据文件的 .lock 后缀判断是加密还是解密,然后调用对应的函数进行加密或解密,并将文件名修改为加密或解密后的文件名。
  6. dc_path 函数根据给定的路径判断是文件还是文件夹,如果是文件夹则递归处理文件夹下的所有文件。

脚本的使用方式为将需要加密或解密的文件或文件夹拖拽到脚本上运行。

Lua 文件加密解密脚本 - 支持文件夹操作

原文地址: https://www.cveoy.top/t/topic/bvWJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录