加密就是把明文通过处理变成密文
解密就是把密文解析成明文
加密的操作对象是 字节码,也就是bytes类型
所以对字符串进行加密时,必须先将 str 转换成 bytes 类型
转换方法:
encode //将 str 转换成 bytes
decode //将 bytes 转换成 str
计算机的存储单位:
byte //字节 最基本的存储单位
bit //最小的计算单位 (也就是一位) 代表计算机底层二进制的 0 1
运算关系
1byte = 8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
...
关于一个汉字的字节:
不同的编码方式,字节也不一样
>>> print("雄".encode('gbk'))
b'\xd0\xdb’ //gbk编码方式,一个汉字时两个字节
>>> print("雄".encode('utf8'))
b'\xe9\x9b\x84’ //utf8(可变长编码)的编码方式, 一个汉字是3个字节
base64转码
base64编码能够 把数据长度变小,可逆推
>>> import base64
>>>
>>> a = 'zhangxiong123456'
>>> a.encode()
b'zhangxiong123456'
>>>
>>> a1 = base64.b64encode(a.encode()) //将字节码转换成base64编码格式
>>> a1
b'emhhbmd4aW9uZzEyMzQ1Ng==‘ //尾部会用 = 补全(特征)
>>>
>>> a2 = base64.b64decode(a1) //将base64编码还原
>>> a2
b'zhangxiong123456'
1,单向加密 ( 哈希 )
2,对称加密( AES,DES )
3,非对称加密( RSA )
单向加密
单向加密 最常见的加密方式 就是MD5( 数据摘要算法 )
MD5的特点:
1,定长输出(32位,128bit);
2,不可逆;
3,加密内容细微改变,加密结果天差地别;
加密方法:
>>> import hashlib
>>>
>>> a = 'zhang’*1000 //明文数据
>>>
>>> h = hashlib.md5() //创建一个md5对象
>>> h.update(a.encode())
>>> print(h.hexdigest()) //打印加密结果
1770475a1e5f70dd0e0e30d940dfe1da //加密后的密文数据
对称加密
1,加密方法是完全公开的,加密 和 解密 完全依赖密钥;
2,密钥长度越长,加解密耗时越长, 也相对更安全;
3,AES相比较DES,加密算法更加复杂;
DES 支持的密钥长度56;
AES 支持的密钥长度128,256,512;
DES加密方法:
( 入口参数有3个 :key( 密钥8个字节 ), data( 要执行的数据 ) ,Mode( 要执行的操作 ))
导入DES
from Cryptodome.Cipher import DES
#密钥
key = b’abcdefgh'
#要加密的数据
text = ‘1234567811223344’ //判断是8字节的倍数
#声明DES对象
des = DES.new(key, DES.MODE_ECB)
#加密
a = des.encrypt(text.encode()) //加密操作只能执行字节码数据
#解密
B = des.decrypt(a)
AES加密方法:
1,分段加密
2,多一个参数 vi ( 偏移量 )
导入AES
From Cryptodome.Cipher import AES
From Cryptodome import Random
#要加密的数据
text = ‘zhangxiong’
#密钥
Key = b'abcdefghabcdefgh’ //128——16 256——32 512——64
#生成iv (分段加密时的偏移量)
iv = Random.new().read(AES,block_size)
#声明aes对象
aes = AES.new(key, AES.MODE_CFB, iv)
#加密
encrypt_text= aes.encrypt(text.encode()) //获得加密后的数据
#使用上面同一个vi 和 key 再次生成一个aes对象
decrypt_aes = AES.new(key, AES.MODE_CFB, iv) //因为再次调用aes,会再次执行生成aes对象,因为vi时一个随机值,第二次调用时的aes对象会跟加密时使用的aes对象不一样,就无法完成解密,因此只能使用同一个vi 和 key 重新生成一次aes对象,这样就确保了 加密 和 解密 的aes对象一致;
#解密
decrypt_aes.decrypt(encrypt_text)
******************************************************************
以上加密后的数据展示
B’p}\x08\xae\x182&\x80’
可以使用binascii转换
from binascii import b2a_hex
B2a_hex() //使用此方法
结果: b’e7c6c53222396ff'
******************************************************************
加解密在我们工作中使用场景非常多,尤其是做爬虫时,经常需要逆向分析 网站的加密方式(采用的加密方法 和 加密内容(会有一些干扰参数+打乱顺序组合)),找到规律之后,然后 去模拟加密处理我们的请求报文, 骗过认证等等.
欢迎大家跟我交流哈~