前言

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

网上文章都利用 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. T-4-java核心API-集合类

    一.集合 用于存储类型一致的一组对象的数据结构. 类似于数组,但是集合提供了操作算法:集合=数据存储+操作算法.集合的用途极其广泛,如歌曲列表,联系人列表对话记录等. 集合比数组多了操作算法,便于提高 ...

  2. 利用jsonp调用外部ip地址池

    <html lang="en"> <head> <meta charset="UTF-8"> <title>Do ...

  3. 组件内守卫beforeRouteEnter和beforeRouteLeave

    beforeRouteEnter用法和其他守卫差不多. 有个注意的地方就是beforeRouteEnter不能用this获取组件内收据. 在next()方法内存入vm这个参数,获取组件内数据. bef ...

  4. Nexus安装、使用说明、问题总结

    Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...

  5. linux 挂载ntfs格式的硬盘

    一.安装ntfs 1.下载 sudo wget  https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz 2.解压 sudo tar ...

  6. Python_day9

    多继承: python支持,但不建议使用 dir(): 获取类或者对象的方法和属性 __mro__:获取类的继承顺序 class A(object): def run(self): print('ru ...

  7. Exp3 免杀原理与实践_05齐帅

    Exp3 免杀原理与实践 20154305_齐帅 想要弄懂免杀,一定得先把基础问题弄明白啊~~ 一.基础问题回答 (1)杀软是如何检测出恶意代码的? - -检测特征码: 依靠分析总结出计算机病毒中常出 ...

  8. github install

    1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...

  9. C语言fprintf, fwrite, fscanf, fread混用问题

    int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...

  10. java基础0615

    1. 1)2)   1)输出:Base  2)编译成功,但没有输出. 2. 编译成功,但没有输出. 3. 只有12行的话,不会新建文件.需要create~~ 4. public static void ...