前言

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

网上文章都利用 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,由于编写仓促代码质量很差,后面会专门写一个密码管理的脚本然后优化下这个脚本。

最新文章

  1. WinForm/MIS项目开发之中按钮级权限实践
  2. Linux下配置IP及安装vmware tool
  3. poj 3321 Apple Trie
  4. jQuery的$.ajax示例
  5. .NET 4.6中的性能改进
  6. dancing link 学习资源导航+心得
  7. [翻译]AOP编程
  8. 【log4js】
  9. Adobe Acrobat XI Pro 两种破解方式 Keygen秘钥 license替换 亲测有效
  10. PHP - 使用 Pear 进行安装和卸载包
  11. BD string 百度之星初赛的题目 数学
  12. Swift中不用桥接文件和.h头文件直接和C代码交互的方法
  13. 【翻译】EXTJS 编码风格指南与实例
  14. 背包问题——dfs
  15. springboot aop 自定义注解
  16. less的安装和使用
  17. Java程序设计概述
  18. Zookeeper之Zookeeper的Client的分析【转】
  19. 高斯混合模型 GMM
  20. linux python虚拟环境 相关的

热门文章

  1. zepto 源码 $.contains 学习笔记
  2. select、poll、epoll
  3. 添加sqljdbc的maven依赖JAVA环境配置
  4. 数据库导出sql
  5. win7 ssh linux虚拟机(ubuntu12.04)
  6. python网络爬虫开发实战(崔庆才)_14页_chromedriver环境配置和加载
  7. Mysql函数大全以及存储过程、函数、触发器、游标等等
  8. Python之旅Day15 Bootstrap与Django初识
  9. 剑指offer面试题17:合并两个排序的链表
  10. Javascript高级编程学习笔记(41)—— DOM(7)DocumentFragment类型