字符加密
# 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')