Python 的AES加密与解密

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB

从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现。
python 在 Windows下使用AES时要安装的是pycryptodome 模块 。

pip install pycryptodome 

python 在 Linux下使用AES时要安装的是pycrypto模块。

pip install pycrypto 
区别:
  1. CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
  2. ECB加密不需要iv

AES CBC 加密的python实现

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')

# 加密函数
def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_CBC
    iv = b'qqqqqqqqqqqqqqqq'
    text = add_to_16(text)
    cryptos = AES.new(key, mode, iv)
    cipher_text = cryptos.encrypt(text)
    # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
    return b2a_hex(cipher_text)

# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    iv = b'qqqqqqqqqqqqqqqq'
    mode = AES.MODE_CBC
    cryptos = AES.new(key, mode, iv)
    plain_text = cryptos.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')

if __name__ == '__main__':
    e = encrypt("hello world")  # 加密
    d = decrypt(e)  # 解密
    print("加密:", e)
    print("解密:", d)

AES ECB加密的python实现

"""
ECB没有偏移量
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')

# 加密函数
def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_ECB
    text = add_to_16(text)
    cryptos = AES.new(key, mode)

    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text)

# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_ECB
    cryptor = AES.new(key, mode)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')

if __name__ == '__main__':
    e = encrypt("hello world")  # 加密
    d = decrypt(e)  # 解密
    print("加密:", e)
    print("解密:", d)
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用 Python 进行 AES 加密解密的示例代码: ```python from Crypto.Cipher import AES import base64 # 加密函数 def aes_encrypt(key, data): # 将密钥和数据进行补位 key = key.encode('utf-8') data = data.encode('utf-8') key = key.ljust(16, b'\0') data = data.ljust(16, b'\0') # 创建 AES 加密aes = AES.new(key, AES.MODE_ECB) # 加密 encrypted_data = aes.encrypt(data) # 对加密结果进行 base64 编码 base64_data = base64.b64encode(encrypted_data) return base64_data.decode('utf-8') # 解密函数 def aes_decrypt(key, encrypted_data): # 将密钥和加密数据进行补位 key = key.encode('utf-8') encrypted_data = encrypted_data.encode('utf-8') key = key.ljust(16, b'\0') encrypted_data = base64.b64decode(encrypted_data) # 创建 AES 解密aes = AES.new(key, AES.MODE_ECB) # 解密 decrypted_data = aes.decrypt(encrypted_data) return decrypted_data.decode('utf-8').rstrip('\0') # 示例 key = '1234567890123456' data = 'Hello, world!' encrypted_data = aes_encrypt(key, data) decrypted_data = aes_decrypt(key, encrypted_data) print('加密前的数据:', data) print('加密后的数据:', encrypted_data) print('解密后的数据:', decrypted_data) ``` 在示例中,使用了 PyCryptodome 库中的 AES 加密解密函数来实现加密解密操作。需要注意的是,为了保证密钥和数据的长度符合 AES 加密算法的要求,需要在密钥和数据后面进行补位。在示例中,采用了将字符串转换成字节数组的方式进行补位。同时,在加密操作中,还对加密结果进行了 base64 编码,以便于传输和存储。 ### 回答2: Python AES加密解密是利用Python中的加密库来实现AES算法的加密解密操作。AES是一种常用的对称加密算法,可以对数据进行高强度的加密,并可以通过相同密钥进行解密。 在Python中,我们可以使用第三方库PyCryptodome来实现AES加密解密。首先,需要安装PyCryptodome库,可以使用pip命令进行安装。 安装完成后,我们可以通过以下代码进行AES加密解密的操作: ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # 生成随机的16字节密钥 key = get_random_bytes(16) # 初始化AES实例,使用ECB模式 cipher = AES.new(key, AES.MODE_ECB) # 待加密的数据 data = b'This is some data to be encrypted' # 执行加密操作 ciphertext = cipher.encrypt(pad(data, AES.block_size)) print('加密后的数据:', ciphertext) # 执行解密操作 decrypted_data = unpad(cipher.decrypt(ciphertext), AES.block_size) print('解密后的数据:', decrypted_data) ``` 在上述代码中,首先我们通过`get_random_bytes`函数生成了一个随机的16字节密钥。然后,使用生成的密钥以ECB模式初始化了一个AES实例。接下来,我们定义了待加密的数据,并通过`pad`函数进行填充,保证数据长度是AES块大小的整数倍。然后,调用`encrypt`函数对数据进行加密,并通过`print`函数打印出加密后的数据。 接着,我们调用`unpad`函数对加密后的数据进行解密,并通过`print`函数打印出解密后的数据。 需要注意的是,AES的安全性依赖于密钥的安全性,因此在实际应用中,密钥的生成和管理需要采取相应的安全措施。 ### 回答3: Python中实现AES加密解密可以使用`Crypto.Cipher`库。首先,需要安装`pycryptodome`库。可以使用以下命令安装: ``` pip install pycryptodome ``` 然后,我们可以按照下面的步骤使用AES进行加密解密: 步骤 1:导入所需库 ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes ``` 步骤 2:生成随机密钥和初始化向量(IV) ```python key = get_random_bytes(16) # 生成16字节的密钥 iv = get_random_bytes(16) # 生成16字节的初始化向量 ``` 步骤 3:创建AES加密器和解密器,使用生成的密钥和IV ```python cipher = AES.new(key, AES.MODE_CBC, iv) decrypter = AES.new(key, AES.MODE_CBC, iv) ``` 步骤 4:对要加密的数据进行填充 ```python data = b'Hello, World!' padding_length = AES.block_size - (len(data) % AES.block_size) data += bytes([padding_length]) * padding_length ``` 步骤 5:对数据进行加密解密 ```python encrypted_data = cipher.encrypt(data) decrypted_data = decrypter.decrypt(encrypted_data) ``` 最后,我们可以打印出加密解密后的数据: ```python print("加密后的数据:", encrypted_data) print("解密后的数据:", decrypted_data) ``` 这样,我们就完成了使用AES进行加密解密的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值