常见的文件加密方式之【异或加密】,代入原理看例子,帮助更好的理解。

💰💸💲🧧💵💴💶💷💎💹 关注走一走,活到九十九 💹💎💷💶💴💵🧧💲💸💰

遇到任何问题请留言,以便及时解决。如有帮助,辛苦一键三连,十分感谢,互相进步ovo !!!!!!!!

目录

异或加密是什么

异或加密(XOR Encryption)是一种基于逻辑运算"异或"来进行数据加密的方法。在这种加密方式中,数据和密钥通过按位异或操作(XOR)进行结合,生成加密后的数据。异或操作的特点是:

1> 自反性:任何数与自己异或的结果是0,即 A ⊕ A = 0

2> 恒等性:任何数与0异或的结果是其本身,即 A ⊕ 0 = A

3> 交换性:异或操作是交换的,即 A ⊕ B = B ⊕ A

4> 结合性:异或操作是结合的,即 ( A ⊕ B ) ⊕ C = A ⊕ ( B ⊕ C )

加密过程

假设有原始数据 D和密钥 K:

将数据 D和密钥 k按位进行异或操作:E = D ⊕ K,生成加密数据 E

解密过程

由于异或操作的自反性,使用相同的密钥 𝐾 对加密数据 E 进行异或操作可以还原出原始数据 𝐷

即 D = E ⊕ K。

示例

假设原始数据 D=0110,密钥 K=1010:

加密: E = D ⊕ K = 0110 ⊕ 1010 = 1100。

解密: D = E ⊕ K = 1100 ⊕ 1010 = 0110。

异或加密的优点是实现简单、运算速度快,但它的安全性较低,尤其是当密钥重复使用或密钥长度较短时,容易被攻击破解。

下面是一个使用 Lua 编写的对文件进行异或加密的示例代码:

lua 复制代码
-- 异或加密函数
function xor_encrypt(input_filename, output_filename, key)
    -- 打开输入文件
    local input_file = io.open(input_filename, "rb")
    if not input_file then
        print("无法打开输入文件")
        return
    end

    -- 打开输出文件
    local output_file = io.open(output_filename, "wb")
    if not output_file then
        print("无法打开输出文件")
        input_file:close()
        return
    end

    -- 读取输入文件内容并进行异或操作
    local content = input_file:read("*all")
    for i = 1, #content do
        -- 对每个字节进行异或操作
        local byte = string.byte(content, i)
        local encrypted_byte = bit32.bxor(byte, key)  -- 使用bit32库进行异或操作
        output_file:write(string.char(encrypted_byte))  -- 写入加密后的字节
    end

    -- 关闭文件
    input_file:close()
    output_file:close()

    print("文件加密完成")
end

-- 异或解密函数(与加密操作相同,因为异或是自反的)
function xor_decrypt(input_filename, output_filename, key)
    -- 解密操作和加密相同
    xor_encrypt(input_filename, output_filename, key)
end

-- 使用示例
local key = 0xAA  -- 使用一个字节的密钥进行异或加密
xor_encrypt("input.txt", "encrypted.txt", key)  -- 对文件加密
xor_decrypt("encrypted.txt", "decrypted.txt", key)  -- 对文件解密

解释:
xor_encrypt 函数用于将输入文件通过异或加密后保存到输出文件。它逐字节读取文件内容,使用 bit32.bxor 对每个字节与密钥进行异或操作,然后写入加密后的内容。

xor_decrypt 函数实际上与加密函数相同,因为异或是自反操作,也就是说加密和解密使用相同的函数和密钥。

密钥 key 在这里使用 0xAA(十六进制),您可以根据需要更改密钥。

注意:
需要确保 Lua 环境支持 bit32 库,这通常需要在 Lua 5.2 或更高版本中使用。
此示例假设处理的是二进制文件,因此打开文件时使用 "rb" 和 "wb" 模式。如果是文本文件,您可以使用 "r" 和 "w"。

扩展(lua中io.open)

在 Lua 中,io.open 是一个用来打开文件的函数,返回一个文件句柄,可以用来进行文件的读取、写入或其他操作。

语法:

lua 复制代码
file = io.open(filename, mode)

filename:文件的路径。

mode:文件打开模式,常见的模式包括:

"r":以只读方式打开文件。文件必须存在。

"w":以写入方式打开文件。如果文件已存在,会清空文件内容;如果文件不存在,会创建一个新文件。

"a":以追加方式打开文件。如果文件不存在,创建新文件。如果文件存在,写入的内容会添加到文件末尾。

"r+":以读写方式打开文件。文件必须存在。

"w+":以读写方式打开文件。如果文件已存在,会清空文件内容;如果文件不存在,创建新文件。

"a+":以读写方式打开文件。如果文件不存在,创建新文件。如果文件存在,文件指针会定位到文件末尾。

示例:

lua 复制代码
-- 打开文件进行读取
local file = io.open("example.txt", "r")
if file then
    -- 读取文件内容
    local content = file:read("*all")
    print(content)
    -- 关闭文件
    file:close()
else
    print("无法打开文件")
end

-- 打开文件进行写入
local file = io.open("output.txt", "w")
if file then
    file:write("Hello, World!")
    file:close()
else
    print("无法打开文件进行写入")
end

常用方法:

file:read(format):读取文件内容,format 可以是 "*all" (读取全部)、"*line"(读取一行)等。

file:write(data):写入数据到文件。

file:close():关闭文件。

io.open 函数的返回值是文件句柄,如果打开文件失败(例如文件不存在或权限问题),它会返回 nil 和错误信息

相关推荐
Yang-Never1 小时前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
AD钙奶-lalala2 小时前
Mac OS上搭建 http server
java
皮皮林5516 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_456904276 小时前
Spring Boot 用户管理系统
java·spring boot·后端
趁你还年轻_6 小时前
异步编程CompletionService
java
DKPT6 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
sibylyue6 小时前
Guava中常用的工具类
java·guava
奔跑吧邓邓子6 小时前
【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战
java·spring boot·实战·web开发·接口设计
专注API从业者6 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
一笑的小酒馆7 小时前
Android性能优化之截屏时黑屏卡顿问题
android