python中实现AES加密和解密

AES-CBC加密

整个过程key和iv必须保持一致, 在pycharm中实现需要在该文件目录下安装crypto-js, 先cd到该目录, 然后输入命令npm install crypto-js
CBC模式和ECB模式的唯一区别就是多了个iv

let CryptoJS = require('crypto-js');

## AES-CBC模式加密
let key = CryptoJS.enc.Utf8.parse('123456789qwertyu'),  //密钥必须是16位,utf8编码方式
	iv = CryptoJS.enc.Utf8.parse("0123456789ABCDEF");   //iv也是16位哦, utf8编码方式
function jiami(text){
	let encryptedData  = CryptoJS.AES.encrypt(text, key, {
		iv: iv,
	    mode: CryptoJS.mode.CBC,
	    padding: CryptoJS.pad.Pkcs7
	});
	let hexData = encryptedData.ciphertext.toString();
	return hexData;
}
console.log(jiami('iloveyoubaby'));
// hexData = 5d405dde1859ed49e8eaed988b82c8bf


## AES-CBC模式解密
function jiemi(hexData){
    let encryptedHexStr  = CryptoJS.enc.Hex.parse(hexData), //把加密数据以Hex编码方式转成数组
    	encryptedBase64Str  = CryptoJS.enc.Base64.stringify(encryptedHexStr), //把上一步的数组以Baes64编码方式转成字符串 
    	decryptedData  = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
});  
    let text = decryptedData.toString(CryptoJS.enc.Utf8);  
    return text;  // 得到解密结果
}
console.log(jiemi('5d405dde1859ed49e8eaed988b82c8bf'))

那在python中又该怎么实现AES-CBC模式的加密和解密呢?

import base64
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
## 先encode是为了防止明文有中文报错, 中文utf8编码后是占3个字节<gbk编码是占2个字节>, 数字和字母是占1个字节

# 填充函数
def add_to_16(value):   
    while len(value.encode('utf-8')) % 16 != 0:
        value += '\x00'   #  补全, 明文和key都必须是16的倍数
    return value.encode('utf-8')

# 加密
def AESEncrypt():
    text = 'ilvoelove我爱你呀'   
    iv = '0123456789ABCDEF'
    key = '123456789qwertyu'
    aes = AES.new(key=add_to_16(key), mode=AES.MODE_CBC, iv=iv.encode())
    encryptedstr = aes.encrypt(add_to_16(text))   # 加密后得到的字节数据
    # 结果: b'\x8f#\x10\xeb\xf8\x13\xb4\xb5\x11\x9d\x185'
    en_str = base64.b64encode(encryptedstr).decode()  # 以base64编码方式解码, 得到加密字符串!
    # 结果:yMQ6/gTtLURnRg1Iu2ZMiix79u8jsVHHFA2qKs28aQ=
    # en_str = b2a_hex(encryptedstr).decode()  # 以hex编码方式解码, 得到加密字符串
    # 结果:8f2310ebf813b4b5119d183522ed993228b1efdbbc8ec5471c5036a8ab36f1a4
    return en_str   # 把加密后的字节数据返回

# 解密
def AESDecrypt(en_str):
    iv = '0123456789ABCDEF'
    key = '123456789qwertyu'
    # 解密时必须重新构建aes对象
    aes = AES.new(key=add_to_16(key), mode=AES.MODE_CBC, iv=iv.encode())   
    # 先把密文转换成字节型, 再解密, 最后把之前填充的'\x00' 去掉
    decryptedstr = aes.decrypt(base64.decodebytes(en_str)).decode().strip('\x00')   
    # decryptedstr = aes.decrypt(a2b_hex(en_str)).decode().strip('\x00') # 对应上面的hex编码
    print(decryptedstr)

if __name__ == '__main__':
    en_str = AESEncrypt()
    AESDecrypt(en_str)
	

PS : 话说 base64.b64encode(text.encode()) 和 base64.encodebytes(text.encode()) 以及 base64.b64decode(text.encode()) 和 base64.decodebytes(text.encode()) 有什么区别吗?

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是使用 Python 实现 AES 加密和解密的示例代码: ``` import base64 import hashlib import os from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding, serialization from cryptography.hazmat.primitives.ciphers import ( Cipher, algorithms, modes ) def generate_key(password: str, salt: bytes, iterations: int = 100000, key_size: int = 32): kdf = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, iterations, key_size) return kdf def encrypt(plaintext: str, password: str, salt: bytes): # Generate key key = generate_key(password, salt) # Add padding to the plaintext padder = padding.PKCS7(algorithms.AES.block_size).padder() padded_plaintext = padder.update(plaintext.encode()) + padder.finalize() # Generate a random IV iv = os.urandom(16) # Encrypt the plaintext cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) encryptor = cipher.encryptor() ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize() # Concatenate the IV and the ciphertext encrypted_message = iv + ciphertext # Encode the encrypted message as a base64 string encoded_encrypted_message = base64.b64encode(encrypted_message) return encoded_encrypted_message def decrypt(encoded_encrypted_message: str, password: str, salt: bytes): # Decode the encrypted message from a base64 string encrypted_message = base64.b64decode(encoded_encrypted_message) # Split the IV and the ciphertext iv = encrypted_message[:16] ciphertext = encrypted_message[16:] # Generate key key = generate_key(password, salt) # Decrypt the ciphertext cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) decryptor = cipher.decryptor() padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize() # Remove padding from the plaintext unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() plaintext = unpadder.update(padded_plaintext) + unpadder.finalize() return plaintext.decode() ``` 使用示例: ``` password = "secret password" salt = b"salt" plaintext = "hello world" encoded_encrypted_message = encrypt(plaintext, password, salt) print("Encrypted message:", encoded_encrypted_message) decrypted_plaintext = decrypt(encoded_encrypted_message, ### 回答2: 使用Python实现AES加密解密可以使用PyCryptodome库。首先需要安装PyCryptodome库,使用pip安装命令:pip install pycryptodome。 以下是使用Python实现AES加密解密的示例代码: ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from Crypto.Util.Padding import pad, unpad # 定义密钥和初始化向量 key = get_random_bytes(16) iv = get_random_bytes(16) def encrypt(plaintext): cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size)) return ciphertext def decrypt(ciphertext): cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size) return plaintext.decode() # 测试加密和解密功能 plaintext = "Hello, AES!" print("Plaintext:", plaintext) ciphertext = encrypt(plaintext) print("Ciphertext:", ciphertext) decrypted_text = decrypt(ciphertext) print("Decrypted Text:", decrypted_text) ``` 这个示例代码实现AES加密解密的功能。首先定义了一个随机生成的16字节密钥和初始化向量。然后定义了`encrypt`函数和`decrypt`函数分别用于加密和解密。 在加密函数,使用AES.MODE_CBC模式创建了一个AES加密器,并使用密钥和初始化向量进行初始化。然后使用`pad`函数对明文进行填充,并调用加密器的`encrypt`方法进行加密。 在解密函数,同样使用AES.MODE_CBC模式创建一个AES解密器,并使用密钥和初始化向量进行初始化。解密器调用`decrypt`方法对密文进行解密,并使用`unpad`函数去除填充。 最后,测试加密和解密功能。将明文传递给`encrypt`函数进行加密,得到密文。然后将密文传递给`decrypt`函数进行解密,得到原始的明文。 请注意,这个示例代码的密钥和初始化向量是随机生成的,每次运行代码都会生成不同的密钥和向量。在实际应用,应该将密钥和向量保存下来,以便在解密时使用相同的密钥和向量。 ### 回答3: 在Python,可以使用Crypto库来实现AES加密解密功能。首先需要安装Crypto库,可以使用pip命令进行安装。 加密过程如下: ``` from Crypto.Cipher import AES def encrypt(plain_text, key): cipher = AES.new(key, AES.MODE_ECB) encrypted_text = cipher.encrypt(plain_text) return encrypted_text key = b'1234567890123456' # 16字节的密钥 plain_text = b'Hello World!' # 待加密的明文 encrypted_text = encrypt(plain_text, key) print('加密后的结果:', encrypted_text) ``` 解密过程如下: ``` from Crypto.Cipher import AES def decrypt(encrypted_text, key): cipher = AES.new(key, AES.MODE_ECB) plain_text = cipher.decrypt(encrypted_text) return plain_text key = b'1234567890123456' # 16字节的密钥 encrypted_text = b'\xd6#\x82\xa9W\x8c\xf1\x15J\'=0\xe8\x99' # 待解密的密文 decrypted_text = decrypt(encrypted_text, key) print('解密后的结果:', decrypted_text) ``` 需要注意的是,使用AES进行加密和解密时,需要保证密钥的长度是16、24或32字节,分别对应AES-128、AES-192和AES-256算法。此外,AES是一个对称加密算法,加密和解密需要使用相同的密钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值