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です。
参考
こちらを参考にしました。ありがとうございました。