加密一般是對二進制編碼的格式進行加密,對應到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