简介:有人的地方就有江湖,前文 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 比特,密钥长度则可以是128,192或256比特(16、24和32字节)
大致步骤如下:
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))
微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!