常见加密方法解析 + python加解密应用

python加解密应用

加密就是把明文通过处理变成密文
解密就是把密文解析成明文

加密的操作对象是 字节码,也就是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'
******************************************************************

加解密在我们工作中使用场景非常多,尤其是做爬虫时,经常需要逆向分析 网站的加密方式(采用的加密方法 和 加密内容(会有一些干扰参数+打乱顺序组合)),找到规律之后,然后 去模拟加密处理我们的请求报文, 骗过认证等等.
欢迎大家跟我交流哈~

你可能感兴趣的:(Python,加解密)