1、md5加盐加密
str_ = 'this is str'
salt = 'salt'
str_s = str_ + salt
res_str = hashlib.md5(str_s.encode('utf-8')).hexdigest()
print(res_str)
2、rsa加密解密
需要依赖安装第三方包
pip3 install rsa
import rsa
# rsa加密
def rsaEncrypt(str):
# 生成公钥、私钥
(pubkey, privkey) = rsa.newkeys(512)
print("公钥:\n%s\n私钥:\n:%s" % (pubkey, privkey))
# 明文编码格式
content = str.encode("utf-8")
# 公钥加密
crypto = rsa.encrypt(content, pubkey)
return (crypto, privkey)
# rsa解密
def rsaDecrypt(str, pk):
# 私钥解密
content = rsa.decrypt(str, pk)
con = content.decode("utf-8")
return con
if __name__ == "__main__":
str, pk = rsaEncrypt("this is str")
print("加密后密文:\n%s" % str)
content = rsaDecrypt(str, pk)
print("解密后明文:\n%s" % content)
转载https://blog.csdn.net/whatday/article/details/97617461
3、AES加密解密
- AES加密有好几种模式,本文介绍CBC模式和ECB模式,
CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。 - 这两种加密模式,key,vi,和加密的数据的长度必须为16(AES-128)的倍数,所以采用补位的方式,所以在解密完成后也要去除补位的\x00
1、需要安装第三方包
pip3 install pycryptodome
2、CBC模式:
from Crypto.Cipher import AES
class CypherAES:
def __init__(self, key=b'123123131213', vi=b'111111111111'):
self.vi = self.add_to_hex(vi)
self.key = self.add_to_hex(key)
def add_to_hex(self, data_byte):
if isinstance(data_byte, str):
data_byte = data_byte.encode()
while len(data_byte) % 16 != 0:
data_byte += b'\x00'
return data_byte
def encrypt(self, data):
add_data = self.add_to_hex(data)
aes = AES.new(self.key, AES.MODE_CBC, self.vi)
if isinstance(add_data, str):
add_data = add_data.encode()
encrypt_data = aes.encrypt(add_data)
return encrypt_data
def decrypt(self, encrypt_data):
aes = AES.new(self.key, AES.MODE_CBC, self.vi)
decrypt_data = aes.decrypt(encrypt_data)
return decrypt_data.decode().strip(b'\x00'.decode())
aes = CypherAES()
ss = aes.encrypt('11111111112323123')
print(ss)
rrr = aes.decrypt(ss)
print(rrr)
3、ECB模式:
自定义key,其中key可以进行md5加盐加密
from Crypto.Cipher import AES
class CypherAES:
def __init__(self, key=b'123123131213'):
add_key = self.add_to_hex(key)
self.aes = AES.new(add_key, AES.MODE_ECB)
def add_to_hex(self, data_byte):
if isinstance(data_byte, str):
data_byte = data_byte.encode()
while len(data_byte) % 16 != 0:
data_byte += b'\x00'
return data_byte
def encrypt(self, data):
add_data = self.add_to_hex(data)
if isinstance(add_data, str):
add_data = add_data.encode()
encrypt_data = self.aes.encrypt(add_data)
return encrypt_data
def decrypt(self, encrypt_data):
decrypt_data = self.aes.decrypt(encrypt_data)
return decrypt_data.decode().strip(b'\x00'.decode())
aes = CypherAES()
ss = aes.encrypt('11111111112323123')
print(ss)
rrr = aes.decrypt(ss)
print(rrr)
4、扩展:
可将字符串转为字节码对象,再用exec执行,获取结果
obj = compile(rrr, '', 'exec')
exec(obj)
4、zip文件压缩加密
1、使用zipfile进行压缩/解压缩
import zipfile
def zipFile(filename, outFullName):
"""
压缩指定文件夹
:param filename: 目标文件
:param outFullName: 压缩文件
:return: 无
"""
fzip = zipfile.ZipFile(outFullName, "w", zipfile.ZIP_DEFLATED)
fzip.write(filename)
fzip.close()
# fzip.setpassword(pwd=b'123') ,只适用对带密码的文件进行解密,不能进行加密
2、使用pyzipper进行加密压缩
def ace_Zip(filename, outFullName):
"""
:param filename: 目标文件
:param outFullName:压缩文件
:return:
"""
secret_password = b'123445'
with pyzipper.AESZipFile(outFullName, 'w', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) as zf:
zf.pwd = secret_password
zf.write(filename)
3、使用zipfile进行解密压缩
仅支持CRC32加密的zip文件
import zipfile
def jieya(zipfile1):
"""
:param zipfile1: zip文件
:return:
"""
zfile = zipfile.ZipFile(zipfile1, 'r')
pwd = b'123445'
try:
zfile.extractall(pwd=pwd)
return '文件解压密码为:%s'%pwd.decode()
except Exception as e:
print(e)