Lua 文件加密解密脚本 - 支持文件夹操作
这是一个使用 Lua 语言编写的文件和文件夹加密解密脚本,提供了简单易用的加密功能,并支持对文件夹内的所有文件进行批量操作。
加密过程:
- 定义了一个加密密钥
my_key,是一个数字。 - 使用
enc_file函数对文件进行加密。首先读取文件的前 1024 个字节作为文件头,然后使用enc_str函数对文件头进行加密。加密算法为将每个字符的 ASCII 值加上文件长度和索引值以及密钥my_key并取模 256,然后将加密后的文件头写回文件。 - 使用
enc_name函数对文件名进行加密,加密算法为将每个字符的 ASCII 值取模 256 后转为 16 进制,并将空格替换为加号。 - 使用
os.rename函数将文件名加上.lock后缀。
解密过程:
- 使用
dec_file函数对文件进行解密。首先读取文件的前 1024 个字节作为文件头,然后使用dec_str函数对文件头进行解密。解密算法为将每个字符的 ASCII 值减去文件长度和索引值以及密钥my_key并取模 256,然后将解密后的文件头写回文件。 - 使用
dec_name函数对文件名进行解密,解密算法为将每两个字符转为 10 进制后取模 256 并转为对应的字符。 - 使用
os.rename函数将文件名去掉.lock后缀。
其他函数:
getpathes函数用于递归获取文件夹下的所有文件路径。is_dir函数判断给定的路径是否为文件夹。get_path函数获取文件所在的文件夹路径。get_name函数获取文件名。dc_file函数根据文件的.lock后缀判断是加密还是解密,然后调用对应的函数进行加密或解密,并将文件名修改为加密或解密后的文件名。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 单文件加解密
]]
中文注释分析加密流程内容:
该脚本实现了文件和文件夹的加密和解密功能。
加密过程:
- 定义了一个加密的密钥
my_key,为一个数字。 - 使用
enc_file函数对文件进行加密。首先读取文件的前 1024 个字节作为文件头,然后使用enc_str函数对文件头进行加密,加密算法为将每个字符的 ASCII 值加上文件长度和索引值以及密钥my_key并取模 256,然后将加密后的文件头写回文件。 - 使用
enc_name函数对文件名进行加密,加密算法为将每个字符的 ASCII 值取模 256 后转为 16 进制,并将空格替换为加号。 - 使用
os.rename函数将文件名加上.lock后缀。
解密过程:
- 使用
dec_file函数对文件进行解密。首先读取文件的前 1024 个字节作为文件头,然后使用dec_str函数对文件头进行解密,解密算法为将每个字符的 ASCII 值减去文件长度和索引值以及密钥my_key并取模 256,然后将解密后的文件头写回文件。 - 使用
dec_name函数对文件名进行解密,解密算法为将每两个字符转为 10 进制后取模 256 并转为对应的字符。 - 使用
os.rename函数将文件名去掉.lock后缀。
其他函数:
getpathes函数用于递归获取文件夹下的所有文件路径。is_dir函数判断给定的路径是否为文件夹。get_path函数获取文件所在的文件夹路径。get_name函数获取文件名。dc_file函数根据文件的.lock后缀判断是加密还是解密,然后调用对应的函数进行加密或解密,并将文件名修改为加密或解密后的文件名。dc_path函数根据给定的路径判断是文件还是文件夹,如果是文件夹则递归处理文件夹下的所有文件。
脚本的使用方式为将需要加密或解密的文件或文件夹拖拽到脚本上运行。
原文地址: https://www.cveoy.top/t/topic/bvWJ 著作权归作者所有。请勿转载和采集!