Python:DES、AES、RSA加解密

简介:有人的地方就有江湖,前文 Python:暴力破解密码。有暴力破解的地方,就有加密、解密的江湖。密码是一种用来混淆的技术,使用者希望将正常的(可识别的)信息转变为无法识别的信息。但这种无法识别的信息部分是可以再加工并恢复和破解的。

随机密码生成源码:

# -*- coding: UTF-8 -*-
import random
import string

lowercase = string.ascii_lowercase
uppercase = string.ascii_uppercase
digits_case = string.digits
punctuation_case = string.punctuation


def make_password(length, *args):
    all_case = ""
    for i in args:
        all_case += i
    return "".join([random.choices(all_case)[0] for _ in range(length)])


if __name__ == '__main__':
    password = make_password(12, lowercase, uppercase, digits_case, punctuation_case)
    print(f"随机创建的密码为:{password}")

密码的特性:

保密性:防止用户的标识或数据被读取。
数据完整性:防止数据被更改。
身份验证:确保数据发自特定的一方。

加密方式分类:非对称加密算法、对称加密算法、消息摘要算法。

非对称加密算法:

文件加密需要公开密钥(publickey)和私有密钥(privatekey)。
接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。
在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。
非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。
非对称加密算法:RSA、DSA、ECC等算法。

对称加密算法:

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥。
发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。
常见的对称加密算法:DES,AES,3DES等。

消息摘要算法:

消息摘要算法可以验证信息是否被篡改。
在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。
接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。

Python中加密库比较流行的是PyCrypto模块

安装PyCrypto:

pip install pycryptodome

DES加密解密:

全称为 Data EncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法
入口参数有三个:Key、Data、Mode
Key为7个字节共56位,是DES算法的工作密钥;
Data为8个字节64位,是要被加密或被解密的数据;
Mode为DES的工作方式,有两种:加密或解密
3DES(即Triple DES)是DES向AES过渡的加密算法,
使用两个密钥,执行三次DES算法,
加密的过程是加密-解密-加密
解密的过程是解密-加密-解密

DES加密范例:

from Crypto.Cipher import DES

key = b'a1b2c3d4'  # 密钥 8位或16位,必须为bytes


def pad(data):
    """
    # 加密函数,如果text不是8的倍数【加密文本text必须为8的倍数!】,需要补足为8的倍数
    :param data:
    :param text:
    :return: 
    """
    while len(data) % 8 != 0:
        data += ' '
    return data


# 加密
des = DES.new(key, DES.MODE_ECB)
text = 'Life is short, You need Python'
padded_text = pad(text)
encrypted_text = des.encrypt(padded_text.encode('utf-8'))  
print(encrypted_text)

# 解密
plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') 
print(plain_text)

AES加密解密:

高级加密标准(英语:Advanced EncryptionStandard,缩写:AES),这个标准用来替代原先的DES
AES的区块长度固定为128 比特,密钥长度则可以是128192256比特(162432字节)

大致步骤如下:
1、密钥扩展(KeyExpansion),
2、初始轮(Initial Round),
3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,
4、最终轮(Final Round),最终轮没有MixColumns。

一般方式范例:

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

# 秘钥,此处需要将字符串转为字节
key = 'a1b2c3d4'


# 加密内容需要长达16位字符,所以进行空格拼接
def pad(data):
    while len(data) % 16 != 0:
        data += ' '
    return data


# 加密秘钥需要长达16位字符,所以进行空格拼接
def pad_key(key_message):
    while len(key_message) % 16 != 0:
        key_message += ' '
    return key_message


# 加密,模式ECB模式
aes = AES.new(pad_key(key).encode(), AES.MODE_ECB)
text = 'hello world'
encrypted_text = aes.encrypt(pad(text).encode())
encrypted_text_hex = b2a_hex(encrypted_text)
print(encrypted_text_hex)

# 解密
de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding='utf-8', errors="ignore")
print(de[:len(text)])

面向对象方式范例:

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

AES_LENGTH = 16


class PyCrypto:
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_ECB
        self.crypto = AES.new(self.pad_key(self.key).encode(), self.mode)

    def pad(self, text):
        # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
        # 加密内容需要长达16位字符,所以进行空格拼接
        while len(text) % AES_LENGTH != 0:
            text += ' '
        return text

    def pad_key(self, key):
        # 加密密钥需要长达16位字符,所以进行空格拼接
        while len(key) % AES_LENGTH != 0:
            key += ' '
        return key

    def encrypt(self, text):
        # 加密
        self.ciphertext = self.crypto.encrypt(self.pad(text).encode())
        return b2a_hex(self.ciphertext)

    def decrypt(self, text):
        # 解密
        plain_text = self.crypto.decrypt(a2b_hex(text)).decode()
        return plain_text.rstrip(' ')


if __name__ == '__main__':
    pc = PyCrypto('abcdef')
    e = pc.encrypt("0123456789ABCDEF")
    d = pc.decrypt(e)
    print(e, d)

    e = pc.encrypt("luckyTom")
    d = pc.decrypt(e)
    print(e, d)

RSA加密解密:

公钥加密算法,一种非对称密码算法
公钥加密,私钥解密

3个参数:
rsa_n, rsa_e,message
rsa_n, rsa_e 用于生成公钥
message:需要加密的消息

安装RSA库:

pip install rsa

RSA加解密范例:

import rsa
from binascii import b2a_hex, a2b_hex


class RsaCrypto:
    def __init__(self, pubkey, prikey):
        self.pubkey = pubkey
        self.prikey = prikey

    def encrypt(self, data):
        """
        加密
        :param data:
        :return:
        """
        self.ciphertext = rsa.encrypt(data.encode(), self.pubkey)
        return b2a_hex(self.ciphertext)

    def decrypt(self, text):
        """
        解密
        :param text:
        :return:
        """
        decrypt_text = rsa.decrypt(a2b_hex(text), prikey)
        return decrypt_text


if __name__ == '__main__':
    pubkey, prikey = rsa.newkeys(256)
    rs_obj = RsaCrypto(pubkey, prikey)
    text = 'New World'
    ency_text = rs_obj.encrypt(text)
    print(ency_text)
    print(rs_obj.decrypt(ency_text))

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值