Python实现AES加密算法和它的五种加密方式

AES加密算法

高级加密标准(Advanced Encryption Standard,即AES)是常见的对称加密算法,其前身为数据加密标准(Data Encryption Standard,即DES)。AES于2001年由美国国家标准与技术研究院(NIST)选定,用以取代旧的DES加密标准(年代过于久远,现在的它已不再安全)。

AES的具体加密流程如下图所示:

AES加密的ECB(电子密码本)模式

ECB模式的优点:

1、是AES加密最简单的一种模式;

2、它将明文划分成多个数据块,并对每个数据块单独进行加密,算法可以对明文并行处理,加密速度快;

但其缺点也很明显:如果数据块中有重复的明文块,在被加密后会得到同样重复的密文块,安全性较低。

代码实现:

​## 电子密码本模式  ECB  
import base64
from Cryptodome.Cipher import AES
def aes_decode(data, key):
    try:
        aes = AES.new(str.encode(key), AES.MODE_ECB)  # 初始化加密器
        decrypted_text = aes.decrypt(base64.decodebytes(bytes(data, encoding='utf8'))).decode("utf8")  # 解密
        decrypted_text = decrypted_text[:-ord(decrypted_text[-1])]  # 去除多余补位
    except Exception as e:
        pass
    return decrypted_text

# 加密
def aes_encode(data, key):
    while len(data) % 16 != 0:  # 补足字符串长度为16的倍数
        data += (16 - len(data) % 16) * chr(16 - len(data) % 16)
        data = str.encode(data)
        aes = AES.new(str.encode(key), AES.MODE_ECB)  # 初始化加密器
    return str(base64.encodebytes(aes.encrypt(data)), encoding='utf8').replace('\n', '')  # 加密


if __name__ == '__main__':
    key = 'asdfzxcvg0qwerab' 
    data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"  
    mi = aes_encode(data, key)
    print("加密值:", mi)
    print("解密值:", aes_decode(mi, key))

​

AES加密的CBC(密码分组链)模式

CBC模式的优点:

1、不同于ECB模式的加密方法,CBC模式的数据块加密依赖于它的前一数据块的加密结果,即加密后的密文块与其进行异或操作;而打头的数据块则由一个初始化向量(Initialization Vector,即IV)与其进行异或操作。

2、完全避开了密文块会出现相同的情况,因此安全性也大大提高;

然而,CBC模式的操作也会产生一些问题:如果传输途中某一数据块发生损坏,那么解密时这一数据块及其后端都会发生解密错误;

此外,由于每一个数据块都需要等待前一数据块加密完成,因此在处理速度上不敌ECB模式。

代码实现:

​
## 密码分组链模式 CBC 

import base64
from Cryptodome.Cipher import AES

def aes_encode(key, content):
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 处理明文
    content_padding = pkcs7padding(content)
    # 加密
    aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新编码
    result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
    return result

def aes_decode(key, content):
    try:
        key_bytes = bytes(key, encoding='utf-8')
        iv = key_bytes
        cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
        # base64解码
        aes_encode_bytes = base64.b64decode(content)
        # 解密
        aes_decode_bytes = cipher.decrypt(aes_encode_bytes)
        # 重新编码
        result = str(aes_decode_bytes, encoding='utf-8')
        # 去除填充内容
        result = pkcs7unpadding(result)
    except Exception as e:
        result = ""

    return result


if __name__ == '__main__':
    key = 'asdfqwerg01234ab'
    # 对英文加密
    data = '1145141919810'
    # 加密
    mi = aes_encode(key, data)
    # 打印,并解密
    print(mi, aes_decode(key, mi))

​

AES加密的OFB(输出反馈)模式

OFB模式的优点:

1、加密过程首先生成一个密钥流(流密码),然后将这个密钥流与明文异或,从而得到密文。解密过程也类似,首先生成相同密钥流,然后将密钥流与密文异或,从而恢复明文,安全性较高。

2、如果在加密数据传输过程中发生错误,错误只会影响该块数据的解密。不会像CBC模式那样影响后续的数据块。

由于需要生成密钥流,因此处理速度较慢。

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 创建一个密钥
key = get_random_bytes(16)

# 创建一个初始向量
iv = get_random_bytes(16)

# 创建一个cipher
cipher = AES.new(key, AES.MODE_OFB, iv)

# 需要加密的原始数据
data = b"This is a test."

# 加密数据
encrypted_data = cipher.encrypt(data)


# 创建一个新的cipher用于解密
cipher_dec = AES.new(key, AES.MODE_OFB, iv)

# 解密数据
decrypted_data = cipher_dec.decrypt(encrypted_data)

# 输出解密后的数据,应该和原始数据一样
print("Decrypted data:", decrypted_data)

AES加密的CFB(密码反馈)模式

CFB模式的优点:

1、可以处理任意长度的消息,能适应用户不同数据格式的需要。可实现自同步功能。就有有限步的错误传播,除能获得保密性外,还可用于认证。

但是由于CFB模式中分组密码是以流密码方式使用,所以加密和解密操作完全相同,因此无法适用于公钥密码系统,只能适用于对称密钥密码系统。

密码反馈模式也需要一个初始量,无须保密,但对每条消息必须有一个不同的初始量,处理速度较慢。

代码实现:

import base64
from Cryptodome.Cipher import AES
from Cryptodome import Random

def aes_cfb_encode(data, key):
    # 加密
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
    return base64.b64encode(iv + cipher.encrypt(data.encode('utf-8')))

def aes_cfb_decode(enc, key):
    # 解密
    enc = base64.b64decode(enc)
    iv = enc[:AES.block_size]
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
    return cipher.decrypt(enc[AES.block_size:]).decode('utf-8')

if __name__ == '__main__':
    key = 'asdfzxcvg0qwerab'
    data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
    encrypted_data = aes_cfb_encode(data, key)
    print("encrypted data:", encrypted_data)

    decrypted_data = aes_cfb_decode(encrypted_data,key)
    print("decrypted data:", decrypted_data)

AES的CTR(计时器)模式

CFB模式的优点:

1、完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行异或操作 。

2、不泄露明文;仅需实现加密函数;无需填充;可并行计算。

然而,计数器值和密钥的组合必须对每一次加密的数据都是唯一的,否则会引发安全风险。

而且,由于CTR模式下每个块的加密是相互独立的,所以一个块的错误不会传播到其他的块。因此,如果在传输中某一部分数据出错,可能会导致解密的时候无法察觉这一错误,从而接收到错误的明文信息。

代码实现:

import base64
from Cryptodome.Cipher import AES
from Cryptodome.Util import Counter

def aes_ctr_encode(data, key):
    # 制作计数器对象
    ctr = Counter.new(128) 
    # 制作AES对象
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
    # 最后对输入数据进行编码,返回base64编码的加密数据
    return base64.b64encode(cipher.encrypt(data.encode('utf-8')))

def aes_ctr_decode(enc, key):
    # 制作计数器对象
    ctr = Counter.new(128)
    # 制作AES对象
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
    # 解密,并从byte转回到str
    return cipher.decrypt(base64.b64decode(enc)).decode('utf-8')

if __name__ == '__main__':
    key = 'asdfzxcvg0qwerab'
    data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
    encrypted_data = aes_ctr_encode(data, key)
    print("encrypted data:", encrypted_data)

    decrypted_data = aes_ctr_decode(encrypted_data,key)
    print("decrypted data:", decrypted_data)

AES(Advanced Encryption Standard)是一种对称密钥加密算法,它被广泛应用于数据保护领域。在Python中,我们可以使用`cryptography`库来实现AES加密。以下是一个简单的例子,展示了如何创建一个AES加密器解密器: ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend def generate_key(key_size=16): return bytes.fromhex('0123456789abcdef'[i*2:i*2+2] for i in range(key_size // 2)) def pad_data(data, block_size=16): padding = block_size - len(data) % block_size return data + bytes([padding]) * padding def encrypt(plaintext, key): backend = default_backend() cipher = Cipher(algorithms.AES(key), modes.ECB(), backend) encryptor = cipher.encryptor() padded_plaintext = pad_data(plaintext) ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize() return ciphertext def decrypt(ciphertext, key): backend = default_backend() cipher = Cipher(algorithms.AES(key), modes.ECB(), backend) decryptor = cipher.decryptor() padded_ciphertext = decryptor.update(ciphertext) + decryptor.finalize() unpadded_plaintext = padded_ciphertext[:len(padded_ciphertext) - padded_ciphertext[-1]] return unpadded_plaintext.decode() # 使用示例 key = generate_key() plaintext = "This is a secret message" ciphertext = encrypt(plaintext.encode(), key) print(f"Ciphertext: {ciphertext.hex()}") decrypted_text = decrypt(ciphertext, key) print(f"Decrypted Text: {decrypted_text}")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值