如何使用Python函数实现字符串加密和解密?
在实际生产中,字符串加密和解密是很常见的操作。对于需要保密的敏感信息,如密码、银行卡号码等,我们需要对其进行加密处理,以便防止被未经授权的人获取。Python提供了很多内置模块以及第三方模块来实现字符串加密和解密。本篇文章将会围绕Python函数实现字符串加密和解密这一主题展开,通过实例详细说明实现的过程。
1. 加密字符串
字符串加密是指将一个明文字符串转化成不可读的密文字符串。在实际生产中,加密的方式很多,如DES、AES、RSA等。本篇文章以最常见的AES对称加密算法为例,来介绍如何使用Python函数实现字符串AES加密。
1.1 安装第三方库
在Python中,要实现AES加密,需要安装第三方库pycryptodome。可以通过以下命令来进行安装:
pip install pycryptodome
安装好pycryptodome之后,在程序中引入库:
from Crypto.Cipher import AES from Crypto.Random import get_random_bytes
1.2 AES加密函数实现
实现AES加密,需要按照以下步骤进行:
- 准备明文字符串
- 生成密钥和向量
- 实例化AES加密函数
- 加密明文
- 将加密后的密文字符串转换成Base64编码的字符串
以下是实现的代码:
import base64
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
def aes_encryption(plaintext, key):
# 将密钥转换成字节形式
key = bytes(key, 'utf-8')
# 生成一个长度为16的向量
iv = get_random_bytes(AES.block_size)
# 实例化一个AES加密函数
cipher = AES.new(key, AES.MODE_CBC, iv)
# 加密前需要将明文字符串进行填充,
# 使其长度是16的倍数
plaintext = pad(plaintext, AES.block_size)
# 加密明文
ciphertext = cipher.encrypt(bytes(plaintext, 'utf-8'))
# 将密文和向量转换成Base64编码字符串
return {
'ciphertext': base64.b64encode(ciphertext).decode('utf-8'),
'iv': base64.b64encode(iv).decode('utf-8')
}
# 将明文字符串进行填充,
# 使其长度是16的倍数
def pad(s, block_size):
padding_size = block_size - len(s) % block_size
return s + padding_size * chr(padding_size)
以上代码中,aes_encryption函数接受两个参数:明文字符串和密钥。首先将密钥转换成字节形式,然后生成一个长度为16的随机向量,实例化一个AES加密函数。由于AES加密的输入需要是16的倍数,所以需要在加密前对明文字符串进行填充处理,使得字符串长度是16的整数倍。接着将填充后的明文字符串加密,再将加密后的密文和向量转换成Base64编码的字符串,最后返回一个字典,其中包含密文和向量。
1.3 测试AES加密函数
实现了aes_encryption函数之后,可以对其进行测试。以下是测试代码:
if __name__ == '__main__':
plaintext = 'hello world'
key = '1234567890abcdef'
# AES加密
result = aes_encryption(plaintext, key)
print('加密后的密文:', result['ciphertext'])
print('加密使用的向量:', result['iv'])
测试结果如下:
加密后的密文:yLHgMHXp9587w8xillXgAA== 加密使用的向量:Bc2WqZ+dUy9dM/d3CjJQAw==
可以看到,aes_encryption函数已经正确实现了AES加密,并且将密文和向量成功转换成了Base64编码的字符串。
2. 解密字符串
解密字符串是指将一个密文字符串转化成明文字符串。在实际生产中,解密的方式和加密是一一对应的。如对于使用AES加密的密文,需要使用相同的AES解密算法来进行解密。本篇文章继续以AES算法为例,来介绍如何使用Python函数实现字符串AES解密。
2.1 AES解密函数实现
实现AES解密,需要按照以下步骤进行:
- 准备Base64编码的密文和向量
- 将密文和向量转换成字节形式
- 生成密钥
- 实例化AES解密函数
- 解密密文
- 将明文字符串进行去除填充操作
以下是实现的代码:
def aes_decryption(ciphertext, key, iv):
# 将密钥转换成字节形式
key = bytes(key, 'utf-8')
# 将密文和向量转换成字节形式,
# 并将密文解码成原始数据
iv = base64.b64decode(iv)
ciphertext = base64.b64decode(ciphertext)
# 实例化一个AES解密函数
cipher = AES.new(key, AES.MODE_CBC, iv)
# 解密密文
plaintext = cipher.decrypt(ciphertext)
# 去除填充
plaintext = unpad(plaintext, AES.block_size)
# 将明文转换成字符串形式并返回
return plaintext.decode('utf-8')
# 去除填充
def unpad(s, block_size):
padding_size = s[-1] if type(s[-1]) == int else ord(s[-1])
return s[:-padding_size]
以上代码中,aes_decryption函数接受三个参数:密文字符串、密钥和向量。首先将密钥转换成字节形式,然后将密文和向量转换成字节形式。接着实例化一个AES解密函数,对密文进行解密。由于解密后的明文字符串可能会有填充,需要对其进行去除填充操作。最后将去除填充的明文字符串转换成Unicode字符串返回。
2.2 测试AES解密函数
实现了aes_decryption函数之后,可以对其进行测试。以下是测试代码:
if __name__ == '__main__':
ciphertext = 'yLHgMHXp9587w8xillXgAA=='
key = '1234567890abcdef'
iv = 'Bc2WqZ+dUy9dM/d3CjJQAw=='
# AES解密
plaintext = aes_decryption(ciphertext, key, iv)
print('解密后的明文:', plaintext)
测试结果如下:
解密后的明文:hello world
可以看到,aes_decryption函数已经正确实现了AES解密,并且将Base64编码的密文和向量成功转换成了字节形式。最后得到了明文字符串"hello world"。
总结
本篇文章主要介绍了如何使用Python函数实现字符串加密和解密操作。以AES对称加密算法为例,通过实例讲解了实现过程。在实际的生产中,加密和解密是很常见的操作,Python也提供了很多的内置模块以及第三方库来实现这些功能。通过本篇文章的学习,相信读者已经掌握了基本的字符串加密和解密的实现方法。
