shell 脚本实现文件对称加密
前言
之前手机里管理密码的脚本,都是直接编写进纯文本然后进行多次归档及压缩来实现不明文存储,一直觉得不太安全,于是昨天晚上编写脚本实现了简单的文件对称加密。
网上文章都利用 openssl
来进行文件加解密,这不符合在手机上运行的需要,所以必须自己编写文件的对称加密。
核心原理解析
对称加密的加密过程使用秘钥将明文转换成密文,而解密过程则使用同个秘钥将密文转换成明文,而最简单的实现就是利用位运算中的亦或运算。
例如下面是一字节明文数据 src
利用一字节秘钥 key
进行亦或运算,生成一字节密文 dst
的过程。
src 1010 1000
key 1100 1000
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 值中的每个字节进行亦或运算,就可以进行加密,然后利用上面谈到的方式进行输出即可,而解密过程只需将明文数据换成密文数据即可。
后话
通过这个简单的脚本,会发现计算机世界真的很简单也很奇妙,一个位运算就对数据实现数据的加解密,而且数据无非就是零与壹,代码所做的就是操作这些零与壹。
完整代码见笔者的 Github,由于编写仓促代码质量很差,后面会专门写一个密码管理的脚本然后优化下这个脚本。
最新文章
- WinForm/MIS项目开发之中按钮级权限实践
- Linux下配置IP及安装vmware tool
- poj 3321 Apple Trie
- jQuery的$.ajax示例
- .NET 4.6中的性能改进
- dancing link 学习资源导航+心得
- [翻译]AOP编程
- 【log4js】
- Adobe Acrobat XI Pro 两种破解方式 Keygen秘钥 license替换 亲测有效
- PHP - 使用 Pear 进行安装和卸载包
- BD string 百度之星初赛的题目 数学
- Swift中不用桥接文件和.h头文件直接和C代码交互的方法
- 【翻译】EXTJS 编码风格指南与实例
- 背包问题——dfs
- springboot aop 自定义注解
- less的安装和使用
- Java程序设计概述
- Zookeeper之Zookeeper的Client的分析【转】
- 高斯混合模型 GMM
- linux python虚拟环境 相关的
热门文章
- zepto 源码 $.contains 学习笔记
- select、poll、epoll
- 添加sqljdbc的maven依赖JAVA环境配置
- 数据库导出sql
- win7 ssh linux虚拟机(ubuntu12.04)
- python网络爬虫开发实战(崔庆才)_14页_chromedriver环境配置和加载
- Mysql函数大全以及存储过程、函数、触发器、游标等等
- Python之旅Day15 Bootstrap与Django初识
- 剑指offer面试题17:合并两个排序的链表
- Javascript高级编程学习笔记(41)—— DOM(7)DocumentFragment类型