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,由于编写仓促代码质量很差,后面会专门写一个密码管理的脚本然后优化下这个脚本。
shell 脚本实现文件对称加密的更多相关文章
- shell脚本中文件测试
shell脚本中文件测试 author:headsen chen 2017-10-17 14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f filename ] ...
- Shell脚本统计文件行数
Shell脚本统计文件行数 转自 http://www.jb51.net/article/61943.htm 示例:row_count.sh文件 awk '{print NR}' row_cou ...
- (转)shell脚本之文件测试操作符及整数比较符
shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一 ...
- shell 脚本大文件处理
shell 脚本大文件处理 字符串处理 s='{"_id":{"$oid":"59b73d80930c17474f9f050d"},&qu ...
- 利用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可 ...
- Shell脚本实现文件遍历和删除操作
本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件. 具体实现 大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件:然后循环文件,删除除最大编码外的文 ...
- shell脚本学习-文件包含
跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename # ...
- shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份
有时我们需要将一个文件夹覆盖到我们的工作目录,但需要自动备份已经存在的文件,一个一个去备份太麻烦了,全部备份又没有必要.shell脚本可以很好滴完成这个任务.原文链接http://back.zhizh ...
- shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令
转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单, 无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...
随机推荐
- nacos 使用记
本文记录SpringBoot和SpringCloud与Nacos作为配置中心的整合过程及问题 Nacos官方使用文档:https://nacos.io/zh-cn/docs/what-is-nacos ...
- shell遍历文件夹
遍历目录下的所有文件 假如有一个文件夹路径为dir,遍历文件 for file in /path/dir/* do if test -f $file then echo $file arrary=($ ...
- 【转】像素 Pixel (Picture Element)
原文链接:https://blog.csdn.net/zssureqh/article/details/78768942 1.像素Pixel 讲到概念,首选Wiki百科.当然我说的是英文版Pixel ...
- recyclerview刷新
https://blog.csdn.net/leejizhou/article/details/51179233 RecyclerView之更新UI数据的高级用法 https://www.cnblog ...
- poj 3159
差分约束 我也忘了谁说的了,反正我记得有人说过,只要是差分约束问题都可以转换成图 至少目前看来都是这样的 我一开始spfa+queue超时 看别人博客才知道要用spfa+stack,感觉智商又下降了一 ...
- vuex简单使用
1.创建src/store/index.js----仓库所在地----暴露store 2.main.js入口文件处引入store,挂载到Vue根实例中 3.创建store/movie.js-----电 ...
- 使用PowerShell快速部署Win12R2虚拟化桌面
PowerShell一直是微软windows_Server产品中重要的一部分,可以通过PowerShell来完成所有的服务器配置,甚至一些在图形界面下无法完成的事情.随着每一个新版本的微软产品或者服务 ...
- Maven4-仓库
坐标和构建是一个构件在Maven世界中的逻辑表示方式,而其物理表示方式是文件.Maven通过仓库来统一管理这些文件 什么是Maven仓库? 在Maven世界中,任何一个依赖,插件或者项目构建的输出,都 ...
- shiro与项目集成开发
shiro与spring web项目开发 加入shiro的jar包 自定义realm /** * 自定义realm 继承授权realm * @author Administrator * */ pub ...
- Chapter 7 Resources in Plug-In(1)
Activity and resource are like twin brothers. And so if the activity need to be solve in Plug-In com ...