Python2-RSA加密文件

 每个人都有自己的小秘密,如何保护好它是非常重要的。我通过Python27结合RSA算法保护我的”小秘密”。

准备

 使用pycrypto库就可以完成RSA加、解密。

Pycrypto

 使用pip快捷安装pycrypto。如果对pycrypto感兴趣,可以参考文档

1
pip install pycrypto

 如果无法使用pip安装,可以在这里下载编译好的源文件进行安装。

终端处理

 终端信息获取可以通过sys.argv或者使用getopt库。

sys

 sys.argv是一个列表对象。用来获取终端信息。终端格式示例。

1
python getinfo.py info1 info2 info3

 sys.argv[0]是getinfo.py,sys.argv[1]是info1,sys.argv[2]是info2,sys.argv[3]是info3。

Getopt

 getopt可以用来获取终端参数,实际使用的时候效果比sys.argv好很多。如果对getopt感兴趣,可以参考文档
 getopt有短格式、长格式。”-h-f:”为短格式,如果后面带冒号说明该参数需要加参数值,不加冒号说明该参数不需要加参数值。”[‘help’, ‘file=’]”为长格式,如果后面带等号说明该参数需要加参数值,如果后面不带等号说明该参数不需要参数值。
 终端格式示例。

1
python getinfo.py -h -f=info.txt

 代码示例。

1
2
3
4
5
6
7
import getopt
opt, args = getopt.getopt(sys.argv[1:], "-h-f:",['help', 'file='])
for opt_name, opt_value in opts:
if opt_name in ('-h', '--help'):
print "This is help!"
if opt_name in ('-f', '--file'):
print opt_value

pycrypto使用

 pycrypto包含许多加密方式:AES、SHA256、RSA等。出于安全性考虑,我使用RSA来加密文件。

生成公、私钥文件

 RSA加密需要使用到公钥文件、RSA解密需要使用到私钥文件。如果大家对RSA算法不了解的话,可以参考Wiki
 通过上文可以得知,生成自己的公钥、私钥文件是十分重要的。pycrypto支持生成公钥、私钥文件。
 代码示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA


random_generator = Random.new().read # 伪随机数生成器
rsa = RSA.generate(self.generateNum, random_generator) # rsa算法生成
private_pem = rsa.exportKey() # 私钥生成
with open('private.pem', 'w') as f: # 生成私钥文件
f.write(private_pem)
public_pem = rsa.publickey().exportKey() # 公钥生成
with open('public.pem', 'w') as f: # 生成公钥文件
f.write(public_pem)

RSA加密

 RSA加密需要使用到公钥文件。
 代码示例。

1
2
3
4
5
6
7
8
9
10
11
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA


message = "My name is Hywell!"
with open('public.pem') as f: # 读取公钥文件
key = f.read()
rsakey = RSA.importKey(key) # 加载公钥
cipher = Cipher_pkcs1_v1_5.new(rsakey)
cipher_text = cipher.encrypt(message) # 加密message

RSA解密

 RSA解密需要使用到私钥文件。
 代码示例。

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA


cipher_text = "This is cryptoStr!"
random_generator = Random.new().read # 伪随机数生成器
with open('ghost-private.pem') as f: # 读取私钥文件
key = f.read()
rsakey = RSA.importKey(key) # 加载私钥
cipher = Cipher_pkcs1_v1_5.new(rsakey)
result = cipher.decrypt(base64.b64decode(encrypt_text), random_generator) # 解密cipher_text

总结

 在编写使用RSA加密文件时,遇到了几个问题,在此记录一下。

  1. 使用getopt库作为命令行参数获取,使用for获取对应参数的值的时候,获取得到值是以=开头。因此,实际需要使用value[1:]来获取;
  2. RSA加密常见的key_size有1024bit、2048bit两种,解密的时候需要选择跟加密时一样的bit;
  3. RSA加密单次加密字符的长度有限制,最大为(key_size/8)-11;
  4. 使用1024bitRSA加密100长度的字符会生成128长度的加密过的字符;
  5. 使用2048bitRSA加密200长度的字符会生成256长度的加密过的字符。

完整代码

 完整代码支持终端获取参数、文件夹所有文件RSA加密、文件夹所有文件RSA解密。
 完整代码已经上传到我的GiHub。如果有兴趣,不妨移步到Github上一观!**Code**。