1. 程式人生 > >python3 base64解碼出現TypeError:Incorrect padding

python3 base64解碼出現TypeError:Incorrect padding

個數 整除 報錯 ssi 16px pre 2個 color odi

今天在解決爬蟲對加密參數的分析時,需要使用到base64解碼。但是過程中出現了TypeError:Incorrect padding的錯誤提示。以下是解決方法,以便查閱。

其實正常使用base64是不會出現問題的,就比如下面的代碼。

 1 #!usr/bin/env python
 2 # coding:utf-8
 3 
 4 import base64
 5 
 6 a = bhello
 7 b = base64.b64encode(a)
 8 # 對a進行base64編碼
 9 print(b)  # baGVsbG8=
10 # 對b進行base64解碼,也就是把a編碼過的內容解碼
11 c = base64.b64decode(b) 12 print(c) # bhello

上面代碼的編碼結果是完整的,所以直接解碼出來沒有問題。如果編碼結果不完整,比如上面代碼中如果給定的bytes對象的值是b‘aGVsbG8‘ ,就會出現TypeError:Incorrect padding異常提示。比如下面的代碼就報錯了。

#!usr/bin/env python
# coding:utf-8

import base64

a = baGVsbG8
b = base64.b64decode(a)
print(b)  #binascii.Error: Incorrect padding

解決方法如下:

 1 #!usr/bin/env python
 2 # coding:utf-8
 3 
 4 import base64
 5 
 6 a = baGVsbG8
 7 missing_padding = 4 - len(a) % 4
 8 if missing_padding:
 9     a += b= * missing_padding
10 b = base64.b64decode(a)
11 print(b) # b‘hello‘

這樣問題就解決了,其實就是在後面加等號。而missing_padding計算的就是等號的個數。如果你算出了=號的數量,直接加=號也是可以的。比如下面的代碼:

1 #!usr/bin/env python
2 # coding:utf-8
3 
4 import base64
5 import chardet
6 
7 a = baGVsbG8
8 c = base64.b64decode(a + b=)
9 print(c) # b‘hello‘

至於計算是怎麽來的,需要了解下base64的原理。用一個等式表示就是,3x8 = 4x6,也就是,以前能存3字節的,現在能存4字節,只不過把原先的位bit進行了分割,而且每一個字節是用6位來表示。因為分割後的每一個字節只有6位了,不足的兩位就以0來填充。而且這4個字節可以看做是一個整體,base64解碼後的bytes長度至少為4且為4的倍數,不足部位以‘=’填充。

聽的很迷糊?其實是我表達的不好,而且懶得畫圖。還是看代碼:

 1 #!usr/bin/env python
 2 # coding:utf-8
 3 
 4 import base64
 5 
 6 # 原始1x8 =8位
 7 a = bh
 8 # base64編碼後 8 / 6 = 1 余2,所以至少需要2個字節位,為了滿足能被4整除,需要補充兩個=號
 9 b = base64.b64encode(a)
10 print(b)  # b‘aA==‘
11 
12 # 把編碼後的結果處理一下,去掉‘=’號
13 c = b.decode(utf-8).rstrip(=)
14 # 對結果進行解碼,前面已經算出需要2個=號了,直接加上就好
15 d = base64.b64decode(c.encode(utf-8) + b= * 2)
16 # 還原結果
17 print(d)  # b‘h‘

這樣就一目了然了,關於base64引發異常總結就到這裏。

python3 base64解碼出現TypeError:Incorrect padding