加密一般是对二进制编码的格式进行加密,对应到python就是Bytes,需要将str转换为Bytes---------用encode和decode
1、md5
1 import hashlib 2 def MD5(str): 3 h1 =hashlib.md5() 4 h1.update(str.encode(encoding = 'utf-8')) 5 return h1.hexdigest() #小写 6 7 if __name__ == "__main__": 8 str ='123232' 9 md5 =MD5(str) 10 print("加密前为 : "+ str) 11 print("加密后为:" + md5)
输出
加密前为 : 123232 加密后为:552effa0980dcec34d29ca4ad27a11e0
2、base64
1 import base64 2 def Ebase64(string): 3 return str(base64.b64encode(string.encode("utf-8")),'utf-8') 4 5 if __name__ == '__main__': 6 string = '123数据' 7 print(f"{string}:{Ebase64(string)}")
输出:
123数据:MTIz5pWw5o2u
3、sha1加密,sha1加密比MD5安全,但也比MD5慢
a = "中国欢迎你".encode('utf-8') print(a) import hashlib b = hashlib.sha1(a).hexdigest() print(b)
输出:
b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xa0' 1457a6057bfc0711a34595ec7a54c47fc4d7ab9f
4、python加密库 Cryptodome
(1)DES加密
from Cryptodome.Cipher import DES import binascii #密钥长64位 key = b'abcddesw' def pad(text): #加密函数,如果text不是8的倍数,补足 while len(text) % 8 != 0: text += ' ' return text #创建DES实例 des = DES.new(key,DES.MODE_ECB) text = "I'm china!" padded_text = pad(text) print(padded_text) #加密 encrypted_text = des.encrypt(padded_text.encode("utf-8")) print(encrypted_text) #解密,rstrip()返回从字符串末尾删除所有字符串的字符串 plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') print(plain_text)
输出
I'm china!
b'\x04mp5.\xac\xd5\xa76M\xc6>s\x95F\xa4'
I'm china!
(2)3DES通过加长DES密钥长度实现,增强爆破难度
(3)AES加密
from Cryptodome.Cipher import AES from Cryptodome import Random from binascii import a2b_hex data = '南来北往' #密钥必须为16(AES-128),24,32 key = b'this is a 16 key' #生成长度等于AES块大小的不可重复的密钥向量 iv =Random.new().read(AES.block_size) print(iv) #使用key和Iv初始化AES对象 mycipher = AES.new(key,AES.MODE_CFB,iv) print(mycipher) cip = mycipher.encrypt(data.encode()) #将iv加到加密的密钥开头 ciptext =iv + cip print(ciptext) #解密需要 key和iv 生成AES对象,取前16位是iv mydecrypt = AES.new(key,AES.MODE_CFB,ciptext[:16]) #取后16位是密钥 decrytext = mydecrypt.decrypt(ciptext[16:]) print(decrytext.decode())
输出
b'"I\xa8e\xd0\x95MK>\xe7+\x07\'\xde\xe2\x13' <Cryptodome.Cipher._mode_cfb.CfbMode object at 0x000000000291B8D0> b'"I\xa8e\xd0\x95MK>\xe7+\x07\'\xde\xe2\x13\xf6\x1e\xd2^R8\xf9.\x05z\x8b\xb5' 南来北往
(3)RSA非对称加密
延伸:APP安全建议:1.使用RSA算法进行数字签名时,建议密钥长不要低于512位,推荐1024位。 2.使用RSA加密时,如果设置工作模式为ECB,建议填充方式为OAEPWithSHA256AndMGF1Padding。
import rsa def rsaEncrypt(str): #生成公钥,私钥 (pubkey,privkey)=rsa.newkeys(512) print("pub:",pubkey) print("priv:",privkey) content =str.encode('utf-8') crypto=rsa.encrypt(content,pubkey) return (crypto,privkey) def rsaDecrypt(str,pk): content = rsa.decrypt(str,pk) con=content.decode('utf-8') return con (a,b)=rsaEncrypt("hello") print('加密后的密文:') print(a) content = rsaDecrypt(a,b) print(content)
输出:
pub: PublicKey(10224716067198480147617638754883355202713448141531736080412727285989130693341793946859623298056210410740038704683106707884390481307747163248998182831361163, 65537) priv: PrivateKey(10224716067198480147617638754883355202713448141531736080412727285989130693341793946859623298056210410740038704683106707884390481307747163248998182831361163, 65537, 5400282618215789429324457144231998061960774737491485919212141878285972345666166553226592021005152635629640166074005915666141173161129536124011174050492769, 5818723586322406878415248931016889575549272227294253767355937422578481050392848819, 1757209449033268399430211948686844080896027565472554340862366664022635977) 加密后的密文: b'\x9e\xf1\xbd\x87S\xd2\xae\xb0]N\xec1mI\xd3mS.\xa8\xbd\x1f\xbc\xde\x96\xaf\xf0\xd7\xe3\xd0\xaf\x1b\x8c\xef\xa7\xd8\xe6\xd9\x8a\xdaL\x86Z\x13\x0e_Q\x9b\x97\xc2\xf6H\xa4=\x93\xad\x00\xfbNP\x19\xb04\xc1\xab' hello