13.python加密

1.加密技术介绍

加密算法和秘钥是加密技术中心最重要的两个元素。

加密算法用于加密和解密的数学函数。秘钥是加密和解密算法中的一种输入参数

 

1.1 加密技术可以分为单向加密和双向加密

单向加密:加密过程中不使用秘钥,将数据加密处理成加密数据,无法被解密。一般通过哈希算法生成密文

双向加密:双向加密可以分为对称加密算法,非对称加密算法、数字签名

 

1.1.1 对称加密算法

发送方和接收方会先协定一个相同秘钥,然后对数据加密和解密使用这一相同的秘钥。最广泛的对称加密算法是AES

优点:算法逻辑公开,计算量小,加密速度快

缺点:如果要和N方通信,需要保管N组秘钥,维护成本大。而且任何一方丢失秘钥会导致数据被破解

 

1.1.2 非对称加密算法(公钥加密算法)

非对称加密算法需要两个秘钥——公共秘钥和私有秘钥。

公钥和秘钥是成对出现的,如果用公钥对一组数据进行加密,只有使用对应的私钥才能对其解密

非对称加密算法中,公钥可以是任何通信方,只要私钥保管好就能保证加密的安全,常见的非对称加密RSA,ECC,DSA

优点:使用不同密钥加密解密更加安全,不同通信方只需要保管一个公钥,维护成本小

缺点:加密解密速度慢,可能是对称加密1000倍以上

 

1.1.3 数字签名

数字签名算非对称加密的一种,它是通过提供可鉴别的数字信息来验证用户或网站身份的一种加密数据。

数字签名通常通过两部分组成,分别是签名信息和信息验证由发送方持有的能够代表自己身份的私钥来生成签名信息,然后由接收方持有的与私钥对应的公钥来验证发送方是否为合法的信息发送者

 

2.python加密技术

2.1 使用MD5加密

MD5加密算法能将任意长度的数据加密并压缩成另一固定长度的数据值

MD5加密算法属于单向加密技术,不可逆。

MD5加密算法的主要作用:大容量数据在用作数据签名签署私钥前,先被压缩成一个固定长度的加密信息,再作为数据传输使用,既保证保密性,也降低传输成本。

MD5加密原理:先将原始数据进行填充处理为512位的整数倍的数据,然后以每512位为一组进行循环计算,将前一组得到的128bit的MD5值作为下一个分组的输入参数进行计算,循环计算后最终得到的128bit的值为最终的MD5的值。

import hashlib

message = "大家一起学python"

md5 = hashlib.md5(message.encode())

print("%s 加密结果是:%s" %(message,md5.hexdigest()))

MD5常用于验证密码的正确性:

import hashlib

class User:
    def __init__(self,username,password):
        self.username = username
        md5 = hashlib.md5(password.encode())
        self.password = md5.hexdigest()

    def check_password(self,password):
        md5 = hashlib.md5(password.encode())
        if md5.hexdigest() == self.password:
            return "密码正确"
        else:
            return "密码错误"

user = User("user1","123456")
print("加密后的密码:",user.password)
print(user.check_password("123"))
print(user.check_password("123456"))

MD5可以通过穷举法暴力破解,因此不仅需要考虑MD5的存储安全性,还要考虑加密过程更安全。可以对MD5数据再次进行MD5加密处理,这样也会更难破解:

import hashlib

def md5(content):
    return hashlib.md5(content.encode()).hexdigest()

message = "一起学python"
print(message)
print("第一次加密:",md5(message))
print("第二次加密:",md5(md5(message)))

 

2.2 使用SHA加密

SHA产生一个名为报文摘要的160位的输出,报文摘要可以被输入到一个可生成或验证报文签名的签名算法中。对报文摘要进行签名可以提高效率。

import hashlib

message = "大家一起学python"

sha1 = hashlib.sha1(message.encode())
print("%s SHA1加密加密结果是:%s" %(message,sha1.hexdigest()))

 

2.3 使用DES加密

DES加密算法是对称加密算法,可进行加密和解密。DES的秘钥长度为8字节。

DES加密原理:以64位的明文作为一个单位进行加密,这64位单位被称为分组,每个分组内将秘钥和明文数据按照一定的规则进行置换和数据位移,从而得到密文。可通过密文和秘钥反推明文。

DES加密三个重要入参:Key,Data,Mode。Key是秘钥,Data是数据原文,Mode是工作模式(加密解密两种)

要使用DES加密,首先得安装第三方类库:

pip install pyDes 
 #              des模式  填充方式  ECB加密方式
from pyDes import des, PAD_PKCS5, ECB
#  秘钥  (如果和Java对接,两边要有相同的秘钥)
DES_SECRET_KEY = '12345678'
s = '这是一段明文'.encode()  # 这里中文要转成字节, 英文好像不用
des_obj = des(DES_SECRET_KEY, ECB, DES_SECRET_KEY, padmode=PAD_PKCS5)  # 初始化一个des对象,参数是秘钥,加密方式,偏移, 填充方式
secret_bytes = des_obj.encrypt(s)   # 用对象的encrypt方法加密
s = des_obj.decrypt(secret_bytes)   # 用对象的decrypt方法解密
print(secret_bytes)
print(s.decode())

注:DES加密算法可以在24小时内破解,不安全,不建议使用

 

2.4 AES算法

AES原理:将数据原文分成相同长度的小组,每次加密一组数据,直到加密完整个数据。分组长度只能是128位,即16个字节。秘钥长度可以是128位,192位,256位。

AES通常涉及四个步骤:替换字节,行位移,列混排,轮秘钥加密

from Crypto.Cipher import AES
import os
from Crypto import Random
import base64
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

"""
aes加密算法
ECB模式
"""


def add_to_16(text):
    if len(text.encode('utf-8'))%16:
        add = 16 - len(text.encode('utf-8')) % 16
    else:
        add = 0
    text = text + ("\0"*add)
    return text.encode('utf-8')


def encrypt(text):
    key = "1234567890123456".encode('utf-8')
    mode = AES.MODE_ECB
    text = add_to_16(text)
    cryptos = AES.new(key, mode)
    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text)


def decrypto(text):
    key = "1234567890123456".encode('utf-8')
    mode = AES.MODE_ECB
    cryptor = AES.new(key,mode)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')

text = encrypt("text")
print(text)

d = decrypto(text)
print(d)

 

2.5 RSA加密

RSA是一种非对称加密算法,使用之前,首先生成一对秘钥,分别是公钥和私钥,遵循“一个秘钥加密的内容可以被另一个秘钥解密”原则。

RSA加密算法中,被公钥加密的数据只能被对应私钥解密,反之亦然。

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto import Random

random_generator = Random.new().read

#生成RSA秘钥对
new_rsa = RSA.generate(1024,random_generator)

#导出私钥用户可以保存下来多次使用
private_pem = new_rsa.exportKey()
print("private key:",private_pem)

#导出公钥公户可以保存下来多次使用
public_pem = new_rsa.publickey().exportKey()
print("public key",public_pem)

def encrypt(pub_key,msg):
    rsa = RSA.importKey(pub_key)
    cipher = PKCS1_OAEP.new(rsa)
    return cipher.encrypt(msg)

def decrypt(priv_key,msg):
    rsa = RSA.importKey(priv_key)
    cipher = PKCS1_OAEP.new(rsa)
    return cipher.decrypt(msg)

plaintext = "大家一起学python"
print("原文:",plaintext)

msg = encrypt(public_pem,plaintext.encode())
print("加密:",msg)

text = decrypt(private_pem,msg)
print("解密:",text.decode())

 

3.加密技术使用场景

3.1 密码存储

当多个人密码相同,那么相同的密码加密得到的密文也就想通,对于这种情况,需要通过“加盐”来防范。

加盐:对用户自定义密码中加入其它成分(hash值或者时间戳),用来增加密码复杂度。

盐也是要存储在数据库中的,用来反复校验用户登录时输入的密码正确与否。

 

3.2 base64加密

base64加密编码让二进制数据可以通过非8-bit的数据传输层进行数据传入,比如电子邮件信息

Base64-encoded回避原始数据少占用33%的存储空间。

import base64

message = "大家一起学python"
msg = base64.b64encode(message.encode())

print("原文:",message)
print("base64加密:",msg)

text = base64.b64encode(msg)
print("base64解码后的文本:",text.decode())

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏哥哥啊Aaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值