没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
15.4 数据加密
在数据传输过程中,为防止数据被第三方获取或篡改,需要对数据进行加密。这里我们学
习一下如何通过 PyCrypto 进行通用加密系统和公钥加密系统的加密及解密。
PyCrypto
https://pypi.python.org/pypi/pycrypto
15.4.1 安装 PyCrypto
如 LIST 15.28 所示,PyCrypto 的安装可以通过 pip 命令进行。由于它包含 C 语言编写的模
块,所以安装时与 Pillow 一样需要 gcc 等编译器。各位可以事先用 apt 安装 python-dev 包和
build-essential 包。本书使用的是 PyCrypto 的 2.6.1 版本。
LIST 15.28 用 pip 命令安装 PyCrypto
$ pip install pycrypto==2.6.1
15.4.2 通用加密系统的加密及解密
通用加密系统在加密和解密时使用同一套密钥。AES、DES 等都属于通用加密算法。AES
的密码长度和块长都高于 DES,因此安全性较高。本书使用的就是 AES。
NOTE
DES(Data●Encryption●Standard)是 1977 年被美国标准化的加密系统。
AES(Advanced●Encryption●Standard)是 2011 年被美国标准化的加密系统。
以 AES 加密、解密时需要用到 PyCrypto 的 Crypto.Cipher.AES 类。下面我们用 PyCrypto 实
现 AES 加密及解密,并将结果输出到屏幕上(LIST 15.29)。
LIST 15.29 aes_encrypt.py
# coding: utf-8
from Crypto.Cipher import AES
KEY = 'testtesttesttest' # 加密和解密时使用的通用密钥
DATA = '0123456789123456' # 数据长度为 16 的倍数
15.4 数据加密
NOTE
DES(Data●Encryption●Standard)是 1977 年被美国标准化的加密系统。
AES(Advanced●Encryption●Standard)是 2011 年被美国标准化的加密系统。
378
第 4 部分 加速开发的技巧
def main():
aes = AES.new(KEY) # 生成 AES 类的实例
encrypt_data = aes.encrypt(DATA) # 加密
print repr(encrypt_data) # 输出至屏幕
decrypt_data = aes.decrypt(encrypt_data) # 解密
print repr(decrypt_data) # 输出至屏幕
if _ _name_ _ == '_ _main_ _':
main()
给 AES.new 函数指定用作密钥的字符串,生成 AES 对象。密钥可以是长度为 16、24、32
字符的任意字符串。数据通过 AES 对象的 encrypt 方法加密,通过 decrypt 方法解密。上述代码
段的执行结果如 LIST 15.30 所示。
LIST 15.30 执行结果
$ python aes.py
'\xf7\xf1\x0ccS\xef\x02\xe10\xf2\xe1\xd2\x80{\xcf\xfa'
'0123456789123456'
执行结果的第一条输出是加密状态的数据,第二条是将加密的二进制串解密后还原的数据。
15.4.3 公钥加密系统(RSA)的加密与解密
公钥加密系统在加密和解密时分别使用不同的密钥。RSA 等就是公钥加密算法。
NOTE
RSA 是 Ron●Rivest、Adi●Shamir、Len●Adleman 于 1977 年发明的加密算法。
RSA 私钥和公钥的生成
在公钥加密系统中,加密使用公钥(Public key),解密使用私钥(Private key)。这两种密钥
都需要通过算法生成。公钥和私钥的密钥对可以通过 ssh-keygen 命令或 openssl 命令来创
建,不过我们这里要学习的是用 PyCrypto 生成密钥的方法。下面,我们用 PyCrypto 生成 RSA
的密钥对,以 PEM 格 式( RFC1421)输出到屏幕上,具体代码如下。
LIST 15.31 rsa_generate_keypair.py
# coding: utf-8
from Crypto.PublicKey import RSA
from Crypto import Random
NOTE
RSA 是 Ron●Rivest、Adi●Shamir、Len●Adleman 于 1977 年发明的加密算法。
第 15 章 方便好用的 Python 模块
379
INPUT_SIZE = 1024
def main():
random_func = Random.new().read # 产生随机数的函数
key_pair = RSA.generate(INPUT_SIZE, random_func) # 生成密钥对
private_pem = key_pair.exportKey() # 获取 PEM 格式的私钥
public_pem = key_pair.publickey().exportKey() # 获取 PEM 格式的公钥
print private_pem # 输出至屏幕
print public_pem # 输出至屏幕
if _ _name_ _ == '_ _main_ _':
main()
LIST 15.31 用 RSA.generate 函数生成了 RSA 密钥对的对象,用 exportKey 方法获取了用作
私钥的 PEM 格式的字符串。公钥则是先通过 publickey 方法获取对象,然后再用 exportKey 方
法获取的。上述代码的执行结果如 LIST 15.32 所示。
LIST 15.32 执行结果
$ python rsa_generate_keypair.py
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDMYS234o1C1Z2fbeZazcUnEfspBcs06hSmvDji+Jm5Gk6tvIHl
IFFu1aCD8kBbjf2ivzmG8Dgtcn6jnLjXe3EB0H1vh70TUsvi0ZjxZsmbv6fJmJrQ
zJvW1Wi3wnoBeVYQk6ha8rbfY35wErxxdTWeWm1nSBwaFfnRFYnrkqVGlQIDAQAB
AoGBAKJZ39Ne6A/bWOa4inA/XQl4QyeHLrDN8bGxew7xpEtiFnX0dMrqLUX59RRb
b7xKwtxxQuVqFXYkqWyWpk6mBFGcRH1yH888Cgu+mSbsKvMAGOW/oTl7XLV8hc4T
m0iT/gEUsCHFcE6mstkUIEMlZCWmnuoijprDbehh1OSEZPQBAkEA1IFgXqMGIC/x
CYwrizFgJVAa/o4IF183CocfqPaYlotKCeNovnPXeSCmAX1d0GhCHKBIQmkmL7YU
TZ1DxiWL1QJBAPY2CWyA26GKGu1WzURJa7guizaqGJpghF30U5VdvdKmetYU2gXA
rhHQ9LxdjG09L9BWSxg5Y1Zl02b8f2Qf78ECQQCNr3VBpBCBhXWAmCSwOcuRFUfq
UWizrJhWPKGvVjuGpHhI/4bm9PXFnS8R7zSNr/XkgDmtjc4YIZ6H4UM+6enBAkBi
yC9jvxdfan9/NdJJUYPMc7AbEIeqeIri/0IBrYiZWX3zIo6OvE2ajFGEuau7sE7c
saKTZ4L5iQUWTrv1ufKBAkEAis4KsI4Inxz01ZPRcmPlUVKULvVqyquqsfKP+NFG
PTurYiXOc2kXPbBNxyhTDQ6Dw3OB0GhARHSGiuhQQicA2w==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMYS234o1C1Z2fbeZazcUnEfsp
Bcs06hSmvDji+Jm5Gk6tvIHlIFFu1aCD8kBbjf2ivzmG8Dgtcn6jnLjXe3EB0H1v
h70TUsvi0ZjxZsmbv6fJmJrQzJvW1Wi3wnoBeVYQk6ha8rbfY35wErxxdTWeWm1n
SBwaFfnRFYnrkqVGlQIDAQAB
-----END PUBLIC KEY-----
在输出的字符串中,从 -----BEGIN RSA PRIVATE KEY----- 到 -----END RSA PRIVATE
KEY----- 的部分为私钥,从 -----BEGIN PUBLIC KEY----- 到 -----END PUBLIC KEY-----
剩余11页未读,继续阅读
资源评论
好知识传播者
- 粉丝: 496
- 资源: 4204
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功