PyCryp 库

1,250 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

执行程序:

image.png

这个字符串就是将“message”加密之后得到的。当然,我们也可以将其转换为16进制的字符串。只需 要将 digest()方法替换为hexdigest()方法即可。

再次执行程序:

image.png

例二:

AES 英语:Advanced Encryption Standard,的缩写,高级加密标准,是目前非常流行的加密算法之一。 加下来通过例子演示AES算法的加密与解密。

加密:

image.png

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”字符串进行加密。然后,通过打印将会得到:

image.png

解密:

当接收到加密的字符串后,解密者必须知道加密时所用的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)