# coding=utf-8
import random
import hashlib
import rsa
from Cryptodome.Cipher import DES
import binascii
from Cryptodome.Cipher import AES
from Cryptodome import Random
def encryption(type,str):
'''字符串加密'''
if type in ('MD5', 'md5'):
'''MD5加密'''
m = hashlib.md5()
m.update(str.encode("utf8"))
return m.hexdigest()
elif type in ('SHA1','sha1'):
'''SHA1加密'''
m = hashlib.sha1()
m.update(str.encode(encoding='utf-8'))
return m.hexdigest()
elif type in ('SHA256' , 'sha256'):
'''SHA256加密'''
m = hashlib.sha256()
m.update(str.encode(encoding='utf-8'))
return m.hexdigest()
elif type in ('SHA224' , 'sha224'):
'''SHA224加密'''
m = hashlib.sha256()
m.update(str.encode(encoding='utf-8'))
return m.hexdigest()
elif type in ('SHA512' , 'sha512'):
'''SHA512加密'''
m = hashlib.sha512()
m.update(str.encode(encoding='utf-8'))
return m.hexdigest()
elif type in ('SHA384' , 'sha384'):
'''SHA384加密'''
m = hashlib.sha512()
m.update(str.encode(encoding='utf-8'))
return m.hexdigest()
elif type in ('RSA' , 'rsa'):
'''RSA加密'''
key = rsa.newkeys(300) # 生成随机密钥
privateKey = key[1] # 私钥
publicKey = key[0] # 公钥
cryptedMessage = rsa.encrypt(str.encode(), publicKey)
# RSA解密过程
message = rsa.decrypt(cryptedMessage, privateKey)
message = message.decode()
return cryptedMessage
elif type in ('DES','des'):
'''DES加密'''
# 设置一个密钥
key = b'abcdefgh' #需要8位密钥
# 需要去生成一个DES对象
des = DES.new(key, DES.MODE_ECB)
text = str + (8 - (len(str) % 8)) * '=' #字符串最少16位,缺少自动在尾部添加'='至16位字符
#DES加密
encrypt_text = des.encrypt(text.encode())
encrypt_text = binascii.b2a_hex(encrypt_text)
# DES解密过程
decrypt_text = binascii.a2b_hex(encrypt_text)
decrypt_text = des.decrypt(decrypt_text)
return encrypt_text
elif type in ('AES' , 'aes'):
'''AES加密'''
#密钥 16位
key = b'abcdefghijklmnop'
# 生成长度等于AES块大小的不可重复的密钥向量
iv = Random.new().read(AES.block_size)
# 使用key和iv初始化AES对象,使用MODE_CFB模式
mycipher = AES.new(key, AES.MODE_CFB, iv)
# 加密的明文长度必须为16的倍数
# 将iv(密钥向量)加到加密的密文开头,一起传输
ciphertext = iv + mycipher.encrypt(str.encode())
# 解密的话要使用key和iv生成新的AES对象
mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16])
# 使用新生成的AES对象,将加密的密文解密
decrypttext = mydecrypt.decrypt(ciphertext[16:])
return ciphertext
elif type in ('XOR','xor'):
'''异或加密'''
# 加密
key = 'abcde' # 密钥
ml = len(str) # 分别得到密钥和明文的长度
kl = len(key)
key = ml // kl * key + key[:ml % kl] # 因为要一对一的异或,所以key要变化
pwd = [] # 通过取整,求余的方法重新得到key
for i in range(len(key)):
pwd.append(chr(ord(key[i]) ^ ord(str[i]))) # 一对一异或操作,得到结果,其中,"ord(char)"得到该字符对应的ASCII码,"chr(int)"刚好相反
#密文
secret = ''.join(pwd)
# 解密
result = []
for j in range(len(key)):
result.append(chr(ord(secret[j]) ^ ord(key[j]))) # 跟KEY异或回去就是原明文
result = ''.join(result)
return secret
else :
return "type error"
if __name__ == "__main__":
print encryption('xor','qwe123456')