常見加密方法解析 + 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'
******************************************************************

加解密在我們工作中使用場景非常多,尤其是做爬蟲時,經常需要逆向分析 網站的加密方式(採用的加密方法 和 加密內容(會有一些干擾參數+打亂順序組合)),找到規律之後,然後 去模擬加密處理我們的請求報文, 騙過認證等等.
歡迎大家跟我交流哈~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章