匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python安全编程:加密与解密、哈希与签名详解

Python安全编程:加密与解密、哈希与签名详解

在现如今的信息时代,随着信息交流的频繁,安全已经成为了我们不得不面对的问题。特别是在网络传输中,为了保障信息传递的安全性,我们需要对信息进行加密、解密、哈希和签名等处理。Python 作为一种高效、易学、易读、易写的编程语言,在这方面也有着很好的支持。接下来,我们就来详细介绍 Python 中加密、解密、哈希和签名的知识点。

一、加密与解密

在 Python 中,常用的加密方法包括对称加密和非对称加密。

1. 对称加密

对称加密是指加密和解密使用同一个密钥的一种加密方式。Python 提供了多种对称加密方法,比如 AES、DES 和 Blowfish 等。其中,AES 是最常用的对称加密算法之一,它支持不同的密钥长度,比如 AES-128、AES-192 和 AES-256。下面是 AES 加密的示例:

```python
import hashlib
from Crypto.Cipher import AES

key = hashlib.sha256(b'my_secret_key').digest()
cipher = AES.new(key, AES.MODE_EAX)
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(b'Hello, world!')
print(ciphertext)
```
在这个例子中,我们首先使用 hashlib 生成了一个 Secret Key,并将其转换成了需要的格式。然后使用 Crypto.Cipher 中的 AES 模块创建了一个新的加密器,并指定加密模式为 EAX。nonce 是一个随机数,用于加密数据。最后,我们使用 encrypt_and_digest 将数据加密,并返回密文和校验和。

解密的代码如下:

```python
import hashlib
from Crypto.Cipher import AES

key = hashlib.sha256(b'my_secret_key').digest()
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
data = cipher.decrypt_and_verify(ciphertext, tag)
print(data)
```

在这里,我们使用与加密相同的密钥、加密算法和 nonce,将密文和校验和传递给 decrypt_and_verify 方法,以解密数据并验证校验和。

2. 非对称加密

非对称加密是指使用一对密钥,分别为公钥和私钥进行加密和解密的方式。公钥可以公开给任何人,而私钥则只有持有者才能使用。Python 中使用非对称加密一般使用 RSA 算法,具体实现如下:

```python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

key = RSA.generate(2048)

private_key = key.export_key()
public_key = key.publickey().export_key()

cipher = PKCS1_OAEP.new(RSA.import_key(public_key))
ciphertext = cipher.encrypt(b'Hello, world!')
print(ciphertext)

decipher = PKCS1_OAEP.new(RSA.import_key(private_key))
plaintext = decipher.decrypt(ciphertext)
print(plaintext)
```

在这个例子中,我们首先使用 RSA.generate 方法生成了一对公私钥,并将它们导出到字符串中。接着,我们使用公钥创建了一个新的加密器,将数据加密成密文。最后,我们使用私钥创建了一个新的解密器,将密文解密。

二、哈希与签名

1. 哈希

哈希是将任意长度的数据变换成固定长度的摘要信息的过程。Python 中常用的哈希算法包括 MD5、SHA-1、SHA-2 和 SHA-3 等。其中,MD5 因为其输出长度为 128 位,而且速度比较快,被广泛应用。下面是一个 MD5 哈希的示例:

```python
import hashlib

hash_object = hashlib.md5(b'Hello, world!')
print(hash_object.hexdigest())
```

在这个例子中,我们使用 hashlib.md5 创建了一个 MD5 哈希对象,并将要哈希的数据传递给了这个对象。然后使用 hexdigest 方法将哈希值以十六进制表示的字符串形式返回。

2. 签名

签名是指使用私钥对某个数据进行加密,以证明数据的真实性和完整性。检验签名时需要使用公钥解密签名,如果解密成功,则证明签名是正确的。Python 中常用的签名算法包括 RSA 和 DSA 等。下面是一个使用 RSA 签名的示例:

```python
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA

key = RSA.generate(2048)
private_key = key.export_key(passphrase=b"password")
public_key = key.publickey().export_key()

hash_obj = SHA256.new(b'Hello, world!')

signature = pkcs1_15.new(RSA.import_key(private_key)).sign(hash_obj)
print(signature)

try:
    pkcs1_15.new(RSA.import_key(public_key)).verify(hash_obj, signature)
    print("The signature is valid.")
except (ValueError, TypeError):
    print("The signature is not valid.")
```

在这个例子中,我们首先用 RSA.generate 方法生成了一对公私钥,并将它们导出到字符串中。然后,我们使用 SHA256 哈希算法对数据进行哈希。接下来,我们使用 RSA 私钥对哈希值进行签名,并将签名打印出来。最后,我们使用 RSA 公钥尝试验证签名,如果验证成功,则打印出“签名有效”;否则,打印出“签名无效”。

综上所述,通过对 Python 中加密、解密、哈希和签名的详细介绍,相信大家已经对 Python 中的安全编程有了较为深入的了解。在实际应用中,我们可以根据需求选择适合的算法和模式,以保障信息的安全性。