持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
PyCryp库
PyCrypto可以做什么?在pypi的下载与介绍页面给出了几个例子。接下来我们就通过这些例子展示 PyCrypto的强大之处。
例一:
SHA—256算法属于密码SHA—2系列哈希。它产生了一个消息的256位摘要。
哈希值用作表示大量数据的固定大小的唯一值。两组数据的哈希值仅在相应数据也匹配时才应当匹配。 数据的少量更改会在哈希值中产生不可预知的大量更改。
接下来的例子演示SHA256 模块的使用。
from Crypto.Hash import SHA256
hash=SHA256.new()
hash.update(b'message')
h=hash.digest()
hash.hexdigest()
print(h)
执行程序:
这个字符串就是将“message”加密之后得到的。当然,我们也可以将其转换为16进制的字符串。只需 要将 digest()方法替换为hexdigest()方法即可。
再次执行程序:
例二:
AES 英语:Advanced Encryption Standard,的缩写,高级加密标准,是目前非常流行的加密算法之一。 加下来通过例子演示AES算法的加密与解密。
加密:
from Crypto.Cipher import AES
#加密
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
message = "The answer is no"
ciphertext = obj.e
iphertext = obj.encrypt(message)
print(ciphertext)
'This is a key123' 为key,他的长度有严格要求,必须为16、24或32位,否则,将会看到下面的错误。
ValueError: AES key must be either 16, 24, or 32 bytes long
'This is an IV456'为VI,他的长度要求更加严格,只能为16位。否则,你将会看到下面的错误。ValueError: IV must be 16 bytes long
然后,通过 encrypt0方法对“message”字符串进行加密。然后,通过打印将会得到:
解密:
当接收到加密的字符串后,解密者必须知道加密时所用的key和vi才能正能够解密。
from Crypto.Cipher import AES
...
#解密
obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
s = obj2.decrypt(ciphertext)
print(s)
通过 decrypt()方法对加密后的字符串进行解密。
fnngj@fnngj-pc:~/pydj$ python3 crypto_demo.py
b'The answer is no'
如果key和VI错误将无法得到正确的字符串。例如,把key 修改为:'This is a key888',解密失败,我们将会得到另一个加密串:
b'\xb1\xf7\xc2\x9d\xf7|&\x05\x89\\xa7\x17\x16\x06\x9b\xf4'
除此之外,PyCrypto还提供一个强大的随机算法。
from Crypto.Random import random
r= random.choice(['dogs', 'cats', 'bears'])
print(r)