欢迎访问宙启技术站
智能推送

如何使用Python函数实现字符串加密和解密?

发布时间:2023-06-13 06:52:47

在实际生产中,字符串加密和解密是很常见的操作。对于需要保密的敏感信息,如密码、银行卡号码等,我们需要对其进行加密处理,以便防止被未经授权的人获取。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也提供了很多的内置模块以及第三方库来实现这些功能。通过本篇文章的学习,相信读者已经掌握了基本的字符串加密和解密的实现方法。