python常见的加密算法


加密一般是对二进制编码的格式进行加密,对应到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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM