系列教程
前言
做了那么多 Lua 脚本破解,我们来尝试写一个不能被破解的加密。
所谓不能被破解,并不是真正不能被破解,只是在没有密码的情况下很难破解。
算法
原理很简单,把原文的每一字节依次和秘钥的每一字节进行异或就行了,原文比密文长的话就把密文再多重复几遍。
例子
原文 Hello, world!
,秘钥 foobar
。
先把他们转换成为 16 进制(其实转换成 2 进制更直观)
原文 48656C6C6F2C20776F726C6421
,秘钥 666F6F626172
。
然后依次异或运算
0x48 ^ 0x66 = 0x2E // H
0x65 ^ 0x6F = 0x0A // e
0x6C ^ 0x6F = 0x03 // l
0x6C ^ 0x62 = 0x0E // l
0x6F ^ 0x61 = 0x0E // o
0x2C ^ 0x72 = 0x5E // ,
秘钥不够长了,那就再从头开始
0x20 ^ 0x66 = 0x46 // 空格
0x77 ^ 0x6F = 0x18 // w
0x6F ^ 0x6F = 0x00 // o
0x72 ^ 0x62 = 0x10 // r
0x6C ^ 0x61 = 0x0D // l
0x64 ^ 0x72 = 0x16 // d
0x21 ^ 0x66 = 0x47 // !
连起来,得到的密文就是 2E0A030E0E5E461800100D1647
。
异或运算其实就是“不兼得”,说的更通俗一些,对应位不相等为 1
,相等为 0
比如 0x48 ^ 0x66
写成二进制就是 01001000 ^ 01100110
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 1 = 1
0 ^ 0 = 0
结果就是 00101110
, 也就是 0x2E
。
异或运算的一个特性就是 a ^ b = c
那么 c ^ b = a
,这样如果 b
是秘钥的话,原文 a
被加密成 c
,c
又可以解密回原文 a
了。
一些额外的操作
其实这一步也没什么必要,就是一个简单的打乱顺序,让结果看起来更奇怪一些,没有什么真正的用途,并不会对防破解有什么作用。
通过概率统计来破解
这种简单异或加密,如果秘钥太短的话很有可能被通过统计方式破解出来,比如源代码有连续的空格,那么密文中就会在这些出现与秘钥相关密文,而且因为空格很常见,可能统计出这些片段从而提取出秘钥。
效果图
支持中文密码
附件
本程序代码开源,具体请在 GitHub 搜索。附件是编译好的版本,使用 Chrome 等版本较新的浏览器打开 dist/index.html
即可。
lua-simple-encrypt.7z
(46.19 KB, 下载次数: 3628)
- 20180525 尝试修复GG修改器错误问题(因为 Lua 数组第一个元素下标为
1
,我错误写成了 0
)
- 20180525 尝试修复GG修改器错误问题(因为 http://lua-users.org/wiki/BitUtils 提供的第一种异或算法在手机上运行存在问题)
- 20180525 增加对中文密码的支持(仅支持UTF-8编码,通常不会出现问题)