lisz-works

プログラミングと興味を貴方に

base64.pyでbinascii.Error: Incorrect paddingを解決してみた

【スポンサーリンク】

Python

base64.pyでこのようなエラーが発生しました。

binascii.Error: Incorrect padding

ということで、調べて解決方法を探ってみました。

原因

このようなことが原因らしい。

エラーの内容は、base64 が4文字づつで処理やってて、
4文字区切りにならないからエラーみたい
引用: https://ameblo.jp/g-pinchan-new/entry-11882983796.html

なるほど。文字数に決まりごとがあるんですね。

解決方法

対応方法として合わせてこのように書かれていました。

base64.urlsafe_b64decode(strg + '=' * (-len(strg) % 4))
引用: https://ameblo.jp/g-pinchan-new/entry-11882983796.html

4文字区切りにならない場合、末尾に「=」を4文字区切りになるように追加してあげるわけですね。

これで帳尻合わせして、上げればOKと。

試してみた

解決方法にのっとって、試してみました。

ちなみにバイナリ型(b'')でやっていますが、文字列型でもやることは変わりません。

エラーを食らったもの

実行するとこのようにエラーが発生します。

>>> b1 = b'{"XXX": {"aa": "xxxxxxxx", "bb": "cccccccccccccccc"}}'
>>> binascii.a2b_base64(b1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: Incorrect padding

解決方法にのっとったデータ

これに文字数が4文字区切りになるように、末尾に「=」を追加。

これで試すと成功します。

>>> b2 = b'{"XXX": {"aa": "xxxxxxxx", "bb": "cccccccccccccccc"}}==='
>>> binascii.a2b_base64(b2)
b'H\x12\x1ak\x1cq\xc7\x1cq\xc5\xb6\xdcq\xc7\x1cq\xc7\x1cq\xc7\x1cq\xc7'

実装を修正する

解決方法を元に実装を修正していきます。

暗号化するデータが、末尾に「=」がない前提です。

末尾に「=」がつくケースがある場合は、別の使われない文字を設定してください

暗号化する側

末尾に4文字区切りに帳尻合わせするための「=」を追加する処理を入れます。

s = "暗号化する文字列"
# --- 追加 ---
s += '=' * (-len(s) % 4)
# ------------
binascii.a2b_base64(s)

復号化する側

復号化した文字列から、末尾の「=」を削除します。

import re  # ←追加
s = "復号化済文字列"
# ↓で末尾の「=」を取った文字列にする
s = re.sub(r'=+$', '', s)

ベースを修正しなくても良い

今回はライブラリ内にある、ソースを修正してみました。

しかし実行するときに、毎回4文字区切りにするようにしてもOKです。

参考

こちらを参考にしました。ありがとうございました。

ameblo.jp

uxmilk.jp