Wolf从零学编程-用Python打造简单加密程序(四)
来源:互联网 发布:windows网络编程 视频 编辑:程序博客网 时间:2024/06/03 04:22
版权声明:本文为博主原创文章,转载请注明出处和链接。
目录(?)[+]
有了一点点RSA的知识作为基础,就可以开着Python-rsa的文档撸代码了。这一篇先单独完成了RSA对DES密钥及大文件的加解密,然后分步实现混合加密过程。
先要吐槽自己,我发现自己在写的过程中,RSA和rsa、DES和des、HASH和hash各种混用,真是不好的习惯,一定要形成自己的使用习惯,不管用大写还是小写,要从始而终。
一、加密DES密钥
现阶段RSA密钥最小建议是1024位,去掉PKCS的11个填充字节,可加密117字节明文,而DES密钥只有8字节,更常使用的3-DES密钥是16字节或24字节,AES是16、24、32个字节密钥,因此RSA可加密任何对称算法的密钥。
在编写DES时,我使用了CBC模式,这个模式要求收发双方共享一个初始值IV,因此实际上我的DES密钥可以算作16字节。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
运行后生成了128字节的enc_file和16字节的dec_file
解密内容正确
二、用RSA加密文件
如果不在乎延迟,可以使用RSA加密大文件,它的原理就是把文件拆分成多个117字节的分组,各组按顺序加密后再连接在一起,解密同样先分组,解密后连接成明文。注意,加密后密文文件会比明文大,因为每一组都会多11个字节填充。
python-rsa提供了对大文件加密的方法
- 1
- 2
- 3
- 1
- 2
- 3
简单的两行代码,就可以实现文件加密。解密的函数是decrypt_bigfile(),参数和加密函数是一模一样的。
- 1
- 2
- 3
- 1
- 2
- 3
三、混合加密
混合加密就是发送方使用DES密钥加密文件形成密文2,用RSA加密DES密钥形成密文1,将密文1和密文2写入密文文件后发送。接收方先读取密文1,解密后用得到的DES密钥解密密文2。
先看加密过程:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
这个代码简单的运行是没有问题的,需要先搞清楚明文文件和密文文件体积的关系。
可以看到,密文比明文大了136个字节,这里面有RSA的功劳,也少不了DES的事儿。
- des_data是16字节,被RSA加密后变为1024bit即128字节,然后被写入密文文件的开头
- 剩下8字节来自DES。因为明文刚好是8的倍数,所以填充了一个分组即8字节;若明文是27135字节,则只会填充一个字节。这种填充方法是PKCS5的规定。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
这段话最下面3行直截了当的告诉我:离8的倍数差1,就填充1个01;差2,就填充2个02;如果刚好是8的倍数,就填充8个08。这里的01、02、08都是十六进制的,08换成二进制就是00001000,为1个字节。
解密过程:
解密中将密钥密文和文件密文分别读取,先解密得到DES密钥和初始值,再用其解密文件。
以下代码和加密代码写在了一个文件里,所以开始的赋值都没有:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
解密文件与源文件的大小是一致的:
内容也是相同的:
不得不说,渣电脑调这段代码请创建test.txt,会快很多。并且在最后部分千万不要试图print(dec_data),不然绝对等到花儿也谢了。
我估计自己会花挺长时间调整RSA,这篇就到这里~下一篇贴出RSA部分的次终极形态
- Wolf从零学编程-用Python打造简单加密程序(四)
- Wolf从零学编程-用Python打造简单加密程序(一)
- Wolf从零学编程-用Python打造简单加密程序(二)
- Wolf从零学编程-用Python打造简单加密程序(三)
- Wolf从零学编程-用Python打造简单加密程序(五)
- Wolf从零学编程-用Python打造简单加密程序(六)
- Wolf从零学编程-用Python打造简单加密程序(七)
- Wolf从零学编程-用Python打造简单加密程序(八)
- Wolf从零学编程-用Python打造简单加密程序(一)
- Wolf从零学编程-用Python打造简单加密程序(二)
- Wolf从零学编程-用Python打造简单加密程序(三)
- Wolf从零学编程-用Python打造简单加密程序(五)
- Wolf从零学编程-用Python打造简单加密程序(六)
- Wolf从零学编程-用Python打造简单加密程序(七)
- Wolf从零学编程-用Python打造简单加密程序(八)
- Wolf从零学编程-用Django撸个Blog(四)
- Wolf从零学编程-用Django撸个Blog(一)
- Wolf从零学编程-用Django撸个Blog(二)
- 让你分分钟理解 JavaScript 闭包
- App工程从Eclipse迁移到Android Studio的问题总结
- 关于两个不知缘由的常见问题的一种解决方法
- 02.jsdate和Math函数
- 50. Pow(x, n)
- Wolf从零学编程-用Python打造简单加密程序(四)
- Java比较时间相差几个月
- Java基础-1、基础语法
- java Excel导入
- Java语言对象池(Object pool)设计模式实例
- POJ 2886 Who Gets the Most Candies?
- 有千位分隔符的数字动画加载效果
- [FreeBSD] 手动分区并恢复数据
- .net Core 启动域名及端口配置