shell 脚本实现文件对称加密

前言

以前手机里管理密码的脚本,都是直接编写进纯文本而后进行屡次归档及压缩来实现不明文存储,一直以为不太安全,因而昨天晚上编写脚本实现了简单的文件对称加密。git

网上文章都利用 openssl 来进行文件加解密,这不符合在手机上运行的须要,因此必须本身编写文件的对称加密。github

核心原理解析

对称加密的加密过程使用秘钥将明文转换成密文,而解密过程则使用同个秘钥将密文转换成明文,而最简单的实现就是利用位运算中的亦或运算。算法

例以下面是一字节明文数据 src 利用一字节秘钥 key 进行亦或运算,生成一字节密文 dst 的过程。安全

src 1010 1000
key 1100 1000
dst 0110 0000

下面则是利用秘钥对密文进行解密的过程,一样也是利用亦或运算。ssh

dst 0110 0000 
key 1100 1000
src 1010 1000

上面介绍的是最核心的原理,下面先讨论密钥和文件数据的读写,再来介绍整个加密过程。优化

不定长密钥

为了使得密钥更安全,因此采用不定的长度,但为了后续编写代码方便,就须要使用摘要算法将不定长密钥映射到统一长度,代码中选择了 md5 算法。加密

下面代码使用 md5sum 命令来获取密钥的 md5 值,注意因为 md5sum 获得的输出包含 -(两个空格)字段加原始值,因此最后一步截取了 md5 值部分。code

password="password" # enter your password
md5=`echo -n "${password}"|md5sum`
md5=${md5%  -*}

文件数据的读写

hexdump 命令能够很方便的来读取文件,并输出自定义的格式,下面就是代码中用来读取文件的命令。md5

hexdump -e '16/1 "%02x" "|"' ${input_file}

这里 -e 选项后面的格式化字符串 '16/1 "%02x" "|"' ,表示每个字节的输出格式为 %02x 即用两位十六进制表示一字节,而每十六字节就输出 | 字符,这是为了后面分割用的,也能够用别的分割字符串代替。ssl

直接利用 echo 命令的 -e 选项,就能够输出十六进制数据,例以下面的例子。

echo -ne "\x41" > ${output_file} # output ASCII character 'A'

总体过程

上面谈到利用 md5 算法将密钥映射到统一的 16 字节的值,因此只须要明文数据的每 16 个字节中的每一个字节,与密钥 16 字节的 md5 值中的每一个字节进行亦或运算,就能够进行加密,而后利用上面谈到的方式进行输出便可,而解密过程只需将明文数据换成密文数据便可。

后话

经过这个简单的脚本,会发现计算机世界真的很简单也很奇妙,一个位运算就对数据实现数据的加解密,并且数据无非就是零与壹,代码所作的就是操做这些零与壹。

完整代码见笔者的 Github,因为编写仓促代码质量不好,后面会专门写一个密码管理的脚本而后优化下这个脚本。

相关文章
相关标签/搜索