shell脚本实现⽂件对称加密
前⾔
之前⼿机⾥管理密码的脚本,都是直接编写进纯⽂本然后进⾏多次归档及压缩来实现不明⽂存储,⼀直觉得不太安全,于是昨天晚上编写脚本实现了简单的⽂件对称加密。
⽹上⽂章都利⽤openssl来进⾏⽂件加解密,这不符合在⼿机上运⾏的需要,所以必须⾃⼰编写⽂件的对称加密。
核⼼原理解析
对称加密的加密过程使⽤秘钥将明⽂转换成密⽂,⽽解密过程则使⽤同个秘钥将密⽂转换成明⽂,⽽最简单的实现就是利⽤位运算中的亦或运算。
例如下⾯是⼀字节明⽂数据src利⽤⼀字节秘钥key进⾏亦或运算,⽣成⼀字节密⽂dst的过程。
src 1010 1000
key 1100 1000
shell最简单脚本
dst 0110 0000
下⾯则是利⽤秘钥对密⽂进⾏解密的过程,同样也是利⽤亦或运算。
dst 0110 0000
key 1100 1000
src 1010 1000
上⾯介绍的是最核⼼的原理,下⾯先讨论密钥和⽂件数据的读写,再来介绍整个加密过程。
不定长密钥
为了使得密钥更安全,所以采⽤不定的长度,但为了后续编写代码⽅便,就需要使⽤摘要算法将不定长密钥映射到统⼀长度,代码中选择了md5 算法。
下⾯代码使⽤md5sum命令来获取密钥的 md5 值,注意由于md5sum得到的输出包含-(两个空格)字段加原始值,所以最后⼀步截取了md5 值部分。
password="password" # enter your password
md5=`echo -n "${password}"|md5sum`
md5=${md5% -*}
⽂件数据的读写
hexdump命令可以很⽅便的来读取⽂件,并输出⾃定义的格式,下⾯就是代码中⽤来读取⽂件的命令。
hexdump -e '16/1 "%02x" "|"' ${input_file}
这⾥-e选项后⾯的格式化字符串'16/1 "%02x" "|"',表⽰每⼀个字节的输出格式为%02x即⽤两位⼗六进制表⽰⼀字节,⽽每⼗六字节就输出|字符,这是为了后⾯分割⽤的,也可以⽤别的分割字符串代替。
直接利⽤echo命令的-e选项,就可以输出⼗六进制数据,例如下⾯的例⼦。
echo -ne "\x41" > ${output_file} # output ASCII character 'A'
整体过程
上⾯谈到利⽤ md5 算法将密钥映射到统⼀的 16 字节的值,所以只需要明⽂数据的每 16 个字节中的
每个字节,与密钥 16 字节的 md5 值中的每个字节进⾏亦或运算,就可以进⾏加密,然后利⽤上⾯谈到的⽅式进⾏输出即可,⽽解密过程只需将明⽂数据换成密⽂数据即可。
后话
通过这个简单的脚本,会发现计算机世界真的很简单也很奇妙,⼀个位运算就对数据实现数据的加解密,⽽且数据⽆⾮就是零与壹,代码所做的就是操作这些零与壹。
完整代码见笔者的,由于编写仓促代码质量很差,后⾯会专门写⼀个密码管理的脚本然后优化下这个脚本。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论