python 加密与解密

python 加密与解密

具体介绍python的加密与解密算法
例如:RSA算法



前言

加密算法分散列算法、对称加密、非对称加密。

由于计算机软件的非法复制,通信的泄密、数据安全受到威胁。一般为了安全,会要求将数据库名称、密码等信息进行加密。所以加密在开发过程中是经常使用到的技术,在一些重要场景中都有所应用,如:登录、支付、oauth等,场景不同需要搭配不一样的签名加密算法来达到业务目标。项目中用到了python端,需要用到python对密码的加密解密模块。加密算法分散列算法、对称加密、非对称加密。


提示:以下是本篇文章正文内容,下面案例可供参考

一、对称加密

1、用途和特点:

  1. 对称加密使用相同的密钥来加密和解密数据。
  2. 加密和解密速度快,适合于大量数据的加密传输。
  3. 常见的对称加密算法包括 DES、AES 等。
  4. 对称加密的主要问题在于密钥管理的安全性,因为发送方和接收方都必须共享同一个密钥。

2、AES加密实现

AES有5种加密模式,分别是ECB, CBC, CTR, CFB, OFB。下面以AES的CBC模式为例。

2.1 加密

def aes_cbc_encrypt(key, iv, plaintext):
    '''
    cbc加密
    :param key:
    :param iv:
    :param plaintext: 二进制数据
    :return: 二进制数据
    '''
    # 使用 PKCS7 填充
    padder = padding.PKCS7(algorithms.AES.block_size).padder()
    padded_plaintext = padder.update(plaintext) + padder.finalize()

    # 创建一个 AES 加密器
    backend = default_backend()
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    encryptor = cipher.encryptor()

    # 加密明文
    ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize()
    return ciphertext

2.2 解密

def aes_cbc_decrypt(key, iv, ciphertext):
    '''
    cbc解密
    :param key:
    :param iv:
    :param ciphertext: 二进制数据
    :return: 二进制数据
    '''
    # 创建一个 AES 解密器
    backend = default_backend()
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    decryptor = cipher.decryptor()

    # 解密
    decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()

    # 去除填充
    unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
    unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
    return unpadded_data

2.3 测试

def test():

    # 生成随机的 16 字节密钥和 IV
    key = os.urandom(16)
    iv = os.urandom(16)

    # 明文
    plaintext = "Hello, AES encryption with CBC mode!"

    # 加密
    ciphertext = aes_cbc_encrypt(key, iv, plaintext.encode())
    print("Cipher Text:", ciphertext.hex())

    # 解密
    decrypted_data = aes_cbc_decrypt(key, iv, ciphertext)
    print("Decrypted Text:", decrypted_data.decode())

二、非对称加密

1、用途和特点:

  1. 非对称加密使用一对密钥,公钥用于加密数据,私钥用于解密数据。
  2. 公钥是公开的,任何人都可以使用它来加密数据,而私钥是保密的,只有持有者才能解密数据。
  3. 非对称加密用于安全地交换密钥或数字签名,以确保数据的机密性和完整性。
  4. 常见的非对称加密算法包括 RSA、DSA、ECC 等。

2、RSA加密实现

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥来加密和解密数据。RSA算法包括密钥生成、加密、解密三个步骤。SA算法在数据传输过程中广泛用于安全地加密敏感信息,例如在Web浏览器和服务器之间进行安全通信,数字签名,以及安全地交换对称加密密钥等方面。它是公认的安全可靠的加密算法之一。

2.1 密钥生成

def generate_rsa_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,  # 用于生成 RSA 公钥的指数值
        key_size=2048,          # 用于生成的 RSA 密钥对的位数
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

2.2 加密

def encrypt_data(data, public_key):
    encrypted_data = public_key.encrypt(
        data, padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted_data

2.3 解密

def decrypt_data(encrypted_data, private_key):
    decrypted_data = private_key.decrypt(
        encrypted_data,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted_data

2.4 输入输出到文件

# 保存密钥对到文件
def save_key_pair(private_key, public_key):
    with open('private_key.pem', 'wb') as f:
        f.write(private_key.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.PKCS8,
            encryption_algorithm=serialization.NoEncryption()
        ))
    with open('public_key.pem', 'wb') as f:
        f.write(public_key.public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PublicFormat.SubjectPublicKeyInfo
        ))


# 从文件中加载密钥对
def load_key_pair():
    with open('private_key.pem', 'rb') as f:
        private_key = serialization.load_pem_private_key(
            f.read(),
            password=None,
            backend=default_backend()
        )
    with open('public_key.pem', 'rb') as f:
        public_key = serialization.load_pem_public_key(
            f.read(),
            backend=default_backend()
        )
    return private_key, public_key

2.5 测试

	private_key, public_key = generate_rsa_key_pair()    # 生成公私钥
    save_key_pair(private_key, public_key)       # 将公私钥保存到文件中

    data = "Hello, RSA!"
    encrypted_data = encrypt_data(data.encode(), public_key)
    print("Encrypted data:", encrypted_data)

    decrypted_data = decrypt_data(encrypted_data, private_key)
    print("Decrypted data:", decrypted_data.decode())

三、摘要算法(哈希算法)

1、用途和特点:

  1. 摘要算法也称为哈希算法,它将任意长度的消息转换为固定长度的哈希值。
  2. 哈希值是唯一的,即使输入的消息只有微小的改动,输出的哈希值也会有很大的变化。
  3. 常见的摘要算法包括 MD5、SHA-1、SHA-256 等。
  4. 摘要算法通常用于验证数据的完整性,密码存储(使用哈希值而不是原始密码),以及生成唯一的标识符等。

2、实现

Python的hashlib提供了常见的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。摘要算法又称哈希算法、散列算法。

2.1 MD5加密

import hashlib
hash = hashlib.md5()

hash.update("hello".encode())
print(hash.hexdigest())

2.2 SHA1加密

import hashlib
hash = hashlib.sha1()
hash.update("hello".encode())
print(hash.hexdigest())

2.3 SHA224加密

import hashlib
hash = hashlib.sha224()
hash.update("hello".encode())
print(hash.hexdigest())

2.4 SHA256加密

import hashlib
hash = hashlib.sha256()
hash.update("hello".encode())
print(hash.hexdigest())

2.5 归纳

在 MD5、SHA1、SHA224、SHA256、SHA384 和 SHA512 中,SHA256、SHA384 和 SHA512 等基于 SHA-2 算法族的算法通常被认为具有更强的加密性。这是因为它们提供了更大的输出长度和更强大的抗碰撞能力,使得对抗密码分析攻击更加困难。

具体来说:

  1. SHA256 输出长度为 256 位,提供了较高的抗碰撞能力,通常被广泛应用于加密应用中。
  2. SHA384 输出长度为 384 位,提供了更高的安全性,但也会带来一定的性能损耗。
  3. SHA512 输出长度为 512 位,提供了更强的安全性,但相对于 SHA256 和 SHA384,它的计算成本更高。
  • 44
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值