对称加密算法和非对称加密算法的区别和联系

以下是对您提供的代码片段的详细讲解:

非对称加密算法RSA

密钥对生成
from cryptography.hazmat.primitives.asymmetric import rsa

# 固定密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,  # 公钥指数,通常使用65537
    key_size=2048,          # 密钥长度,2048位是常见的选择
)
public_key = private_key.public_key()  # 从私钥生成公钥
  • rsa.generate_private_key:生成RSA私钥。
    • public_exponent:公钥指数,通常使用65537,因为它是一个常用的费马素数,具有良好的加密性能。
    • key_size:密钥长度,2048位是目前广泛使用的长度,提供了较强的安全性。
  • private_key.public_key():从私钥生成公钥,公钥用于加密数据,私钥用于解密数据。
加密和解密
from cryptography.hazmat.primitives.asymmetric import padding

# 固定明文
message = b"3212"

# 加密消息
encrypted = public_key.encrypt(
    message,
    padding.PKCS1v15()  # 使用PKCS1 v1.5填充模式
)

# 解密消息
decrypted = private_key.decrypt(
    encrypted,
    padding.PKCS1v1.5()  # 使用PKCS1 v1.5填充模式
)

print("Encrypted (hex):", encrypted.hex())
print("Decrypted:", decrypted.decode())
  • public_key.encrypt:使用公钥加密数据。
    • padding.PKCS1v15():指定填充模式为PKCS1 v1.5,这是一种常用的填充模式,适用于加密数据。
  • private_key.decrypt:使用私钥解密数据。
    • padding.PKCS1v1.5():指定填充模式与加密时相同,以确保正确解密。
  • encrypted.hex():将加密后的字节数据转换为十六进制字符串,方便查看和存储。
  • decrypted.decode():将解密后的字节数据解码为字符串,恢复原始明文.
再次加密相同的消息
# 再次加密相同的消息,以检查结果是否固定
encrypted_again = public_key.encrypt(
    message,
    padding.PKCS1v15()  # 使用PKCS1 v1.5填充模式
)

print("Encrypted again (hex):", encrypted_again.hex())
  • 使用相同的公钥和填充模式再次加密相同的明文,可以检查加密结果是否一致。对于PKCS1 v1.5填充模式,加密结果是固定的,即相同的明文和密钥会产生相同的加密结果.

对称加密算法AES

AES加密和解密函数
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

# AES加密
def aes_encrypt(plaintext, key, iv):
    # 确保key是16, 24或32字节长
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv=iv.encode('utf-8'))
    ct_bytes = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))
    return ct_bytes

# AES解密
def aes_decrypt(ct, key, iv):
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv=iv.encode('utf-8'))
    pt = unpad(cipher.decrypt(ct), AES.block_size)
    return pt.decode('utf-8')
  • AES.new:创建一个新的AES加密器。
    • key.encode('utf-8'):将密钥字符串转换为字节数据,AES密钥长度可以是16, 24或32字节。
    • AES.MODE_CBC:指定加密模式为CBC(Cipher Block Chaining),这是一种常用的块加密模式.
    • iv=iv.encode('utf-8'):将初始化向量(IV)字符串转换为字节数据,IV长度必须是16字节.
  • pad:对明文数据进行填充,使其长度为AES块大小(16字节)的倍数,以便进行加密。
  • cipher.encrypt:执行加密操作,返回加密后的字节数据.
  • unpad:去除解密后的数据填充,恢复原始明文长度.
  • cipher.decrypt:执行解密操作,返回解密后的字节数据.
使用示例
# 使用示例
key = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldY"  # 密钥长度可以是16, 24或32字节
iv = "QUJDREVGR0hJSktM"  # 初始化向量,长度必须是16字节
plaintext = "3212"  # 明文

# 加密
encrypted = aes_encrypt(plaintext, key, iv)
print(f'Encrypted: {encrypted.hex()}')

# 解密
decrypted = aes_decrypt(encrypted, key, iv)
print(f'Decrypted: {decrypted}')
  • 密钥和初始化向量:密钥和IV是AES加密和解密的关键参数,必须正确设置和传递.
  • 加密和解密操作:通过调用 aes_encryptaes_decrypt 函数,分别对明文进行加密和对密文进行解密.
  • 输出结果:打印加密后的十六进制字符串和解密后的明文字符串,验证加密和解密的正确性.

这些代码展示了如何使用Python的加密库实现非对称加密算法RSA和对称加密算法AES的基本操作。RSA适用于加密少量数据或密钥交换,AES适用于加密大量数据,两者在实际应用中可以根据需求选择使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值