前言

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

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

shell 脚本实现文件对称加密的更多相关文章

  1. shell脚本中文件测试

    shell脚本中文件测试 author:headsen chen  2017-10-17  14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f  filename  ]   ...

  2. Shell脚本统计文件行数

    Shell脚本统计文件行数 转自 http://www.jb51.net/article/61943.htm    示例:row_count.sh文件 awk '{print NR}' row_cou ...

  3. (转)shell脚本之文件测试操作符及整数比较符

    shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一 ...

  4. shell 脚本大文件处理

    shell  脚本大文件处理 字符串处理 s='{"_id":{"$oid":"59b73d80930c17474f9f050d"},&qu ...

  5. 利用shell脚本统计文件中出现次数最多的IP

    比如有如下文件test.txt 1  134.102.173.43 2  134.102.173.43 3  134.102.171.42 4  134.102.170.9 要统计出现次数最多的IP可 ...

  6. Shell脚本实现文件遍历和删除操作

    本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件. 具体实现 大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件:然后循环文件,删除除最大编码外的文 ...

  7. shell脚本学习-文件包含

    跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename  # ...

  8. shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份

    有时我们需要将一个文件夹覆盖到我们的工作目录,但需要自动备份已经存在的文件,一个一个去备份太麻烦了,全部备份又没有必要.shell脚本可以很好滴完成这个任务.原文链接http://back.zhizh ...

  9. shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令

    转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单,  无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...

随机推荐

  1. 企业微信自建应用移动端动态获取li并给其事件问题总结

    前段时间一个项目增加企业微信移动端应用,其中几个小功能用到ul-li列表点击并获得相应数据: 开始用var lis=$('#ul li'); for(var=i;i<lis.length;i++ ...

  2. c# 自定义日期的时分秒

    DateTime beginTime = DateTime.Now.Date; 2 Console.WriteLine(beginTime); DateTime endTime = , , ); Co ...

  3. 【慕课网实战】三、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    前置要求: 1)Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+ 2)export MAVEN_OPTS=&qu ...

  4. JAVA数据结构之链表

    JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...

  5. admob sdk

    https://support.google.com/admob/answer/2993059?hl=zh-Hans admob sample http://china.inmobi.com/sdk/ ...

  6. hdu 4069 垃圾数独

    首先dfs给每个格子分一个大的区块 其次套板子就a 我一开始直接在选取行的时候填数独,发现超时 我这一行也就4个元素,找到 x <= 81 的列计算元素位置,81 < x <= 16 ...

  7. Exp3 免杀原理与实践 ——20164325王晓蕊

    一.实践基本内容 1.实践目标 (1) 正确使用msf编码器(√),msfvenom生成如jar之类的其他文件(√),veil-evasion(√),加壳工具(√),使用shellcode编程(√) ...

  8. Node.js的安装以及npm的基础使用

    索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...

  9. 前端开发JS白板编程题目若干

    在前端开发参加面试的时候,无论是校招还是社招,往往都会碰到让我们直接在白纸或者白板上手撸代码的题目.由于是手撸代码,这些题目肯定不会过于复杂和冗长,否则面试那么一小会时间根本写不完.本文总结了几个我本 ...

  10. 如何在Linux(Ubuntu)上安装Redmine

    费话就不多说了,本文主要描述如何在如何在Linux(Ubuntu)上安装Redmine.通过这篇文章你将了解如下内容. TL;DR 在Linux(Ubuntu)上安装Redmine的基本流程 配置ph ...