2017-05-24 70 views
1

我想爲Base64使用Python的base64.b64decode解碼字串(成字節)(STR)方法:Base64編碼解碼:特定的字符串不正確的填充(使用正確的填充)

46oWrWpy2gTEGwNnN6Ayy

和我確保它具有4 =的用於填充或出無奈任何這些的倍數:

46oWrWpy2gTEGwNnN6Ayy =

46oWrWpy2gTEGwNnN6Ayy ==

46oWrWpy2gTEGwNnN6Ayy ===

46oWrWpy2gTEGwNnN6Ayy ================================ ==================

但我仍然在Python v3.6.1上得到「不正確的填充」。其他字符串很好。

我向同事展示,他嘗試使用Python 2並觀察相同的響應。

我注意到刪除第一個「4」足以確保Base64解碼工作。

我已閱讀了Python's docs(注意casefold不適用於base64)並且還沒有進一步冒險進入RFC3548,但想知道其他人是否遇到過類似的事情。任何人有任何線索:)?當然,這不可能是Python的Base64解碼器中的一個錯誤?

回答

2

曾爲它出。

Base64文本的每個字符都是原始8位的6位。如果一個字符在原始字節的中間,那麼你缺少一些剩餘的位。維基百科文章(和許多在線答案)似乎使用填充作爲可替換的'0'字節,而不是這種情況(在Base64字典中它應該被編碼爲A)。

由於缺少數據,填充不可互換。

#!/usr/bin/env python3 

# We use hexlify for debugging. 
import binascii 

# We use the Base64 library. 
import base64 

# Base64 works on multiples of 4 characters.. 
# ..Sometimes we get 3/2/1 characters and it might be midway through another. 
def relaxed_decode_base64(data): 

# If there is already padding we strim it as we calculate padding ourselves. 
if '=' in data: 
    data = data[:data.index('=')] 

# We need to add padding, how many bytes are missing. 
missing_padding = len(data) % 4 

# We would be mid-way through a byte. 
if missing_padding == 1: 
    data += 'A==' 
# Jut add on the correct length of padding. 
elif missing_padding == 2: 
    data += '==' 
elif missing_padding == 3: 
    data += '=' 

# Actually perform the Base64 decode. 
return base64.b64decode(data) 

# Debugging 
print(str(relaxed_decode_base64('46oWrWpy2gTEGwNnN6Ayy')) + '\n') 

testString = '' 

for count in range(0, 1024): 
testString += '/' 
print(str(len(testString)) + ' - ' + testString) 
print(binascii.hexlify(relaxed_decode_base64(testString))) 
input() 
0

似乎是在你的數據有問題,沒有涉及到的Python:

$ echo 46oWrWpy2gTEGwNnN6Ayy | base64 -d 
㪭jrÚÄg7 2base64: invalid input 
$ echo 46oWrWpy2gTEGwNnN6Ayy= | base64 -d 
㪭jrÚÄg7 2base64: invalid input 
$ echo 46oWrWpy2gTEGwNnN6Ayy== | base64 -d 
㪭jrÚÄg7 2base64: invalid input 
$ echo 46oWrWpy2gTEGwNnN6Ayy=== | base64 -d 
㪭jrÚÄg7 2base64: invalid input 
$ echo 46oWrWpy2gTEGwNnN6Ayy==== | base64 -d 
㪭jrÚÄg7 2base64: invalid input 

我設法給它這種解碼方式(除去最後的 'Y'):

$ echo 46oWrWpy2gTEGwNnN6Ay | base64 -d 
㪭jrÚÄg7 2