本文教你如何用Python对文件进行不对称加密。
一、引言
前段时间,一个同学找到我说他的电脑中病毒了,电脑上所有重要的文件都变成了*.cryp1,打也打不开,大学生涯的重要文件都没有了,很着急所以让我帮忙看看。嗯,作为程序员的觉悟,第一反应就是开始找资料,看看这个是什么鬼。
Google了一番后,发现这个病毒的名字叫特斯拉勒索者,会把你电脑上的一些文件进行加密,变成*.cryp1,并留下一个比特币支付的链接,让你打钱过去,不打钱就不给你解密的方法,那么如果你中毒了,那么只能恭喜你了!因为除了作者把私钥放出来,否则基本上没有破解的可能。
为什么这么说呢?病毒会对文件进行不对称加密,也就是公钥加密算法。只要保证你的密钥长度足够长,那么基本上就没有破解的可能。为什么这么说呢?你可以想象一下银行卡交易被破解的后果。
二、RSA简介
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法的原理,目前网络上有许多优秀的文章,特别推荐阅读阮一峰老师的文章:
本文主要描述如何使用RSA来对文件进行不对成加密。
三、PyCrypto
PyCrypto是Python中密码学方面比较有名的第三方软件包。可惜的是,它的开发工作于 2012 年就已停止。幸运的是,有一个该项目的分支 PyCrytodome 取代了PyCrypto,可以支持Python3.5,在Windows上,我们可以直接安装:
|
|
相关文档可以直接访问:
四、文件加密
准备好环境之后,那么我们现在来开始模拟黑客
对文件进行加密处理吧!!
如果前面有了解RSA算法的话,那么肯定知道,我们第一步就是要生成公钥和私钥,用公钥对文件进行加密,用私钥对文件进行解密。
4.1 生成公钥和私钥
在这个例子中,我们将生成自己的密钥对。创建 RSA 密钥非常容易:
|
|
当我们执行CreateRSAKeys()后,会在当前目录生成公钥和私钥,我们打开看看。
公钥:
私钥:
当然每次运行的结果都不一定,公钥是公开的,任何人都可以看到,但是私钥一定要保存好,否则一旦泄露,意味着你的信息也不安全了。
4.2 利用公钥对文件进行加密
现在我们来看看如何对文件进行加密处理:
|
|
我们打开一个文件用于写入数据。接着我们导入公钥赋给一个变量,创建一个 16 字节的会话密钥。在这个例子中,我们将使用混合加密方法,即 PKCS#1 OAEP ,也就是最优非对称加密填充。这允许我们向文件中写入任意长度的数据。接着我们创建 AES 加密,要加密的数据,然后加密数据。我们将得到加密的文本和消息认证码。最后,我们将随机数,消息认证码和加密的文本写入文件。
加密后,这个时候你肯定没有办法按照原来的方式打开你的文件了,或者你能打开,显示的也是乱码。
4.3 利用私钥对文件进行解密
现在让我们学习如何解密我们的文件数据:
|
|
我们先以二进制模式读取我们的加密文件,然后导入私钥。注意,当你导私钥时,需要提供一个密码,否则会出现错误。然后,我们文件中读取数据,首先是加密的会话密钥,然后是 16 字节的随机数和 16 字节的消息认证码,最后是剩下的加密的数据。
接下来我们需要解密出会话密钥,重新创建 AES 密钥,然后解密出数据。
解密完成后,我们会发现刚刚打不开或者无法正确显示的文件,又恢复正常了!
五、文件名处理
当然至此,文件加密的部分已经完成,但是为了使这个更像病毒,我们可以模拟黑客的做法,直接把整个文件的后缀名改掉,或者更混蛋一点,我就是想搞破坏,直接把文件名字改成一串没有意义的数值:
5.1 文件重命名
举例比如:blog2.rar ==> yFmcuIzZvxmY.crypt1
|
|
使用了base64对文件名进行编码。
5.2 恢复文件名
举例比如: yFmcuIzZvxmY.crypt1 ==> blog2.rar
|
|
使用了base64对文件进行解码。
六、完整源码
我们把上述几个过程整合起来,然后实现对某一个目录下的所有文件进行不对称加密和不对称解密:
|
|