1. ホーム
  2. encoding

[解決済み] なぜbase64エンコーディングでは、入力長が3で割り切れない場合、パディングが必要なのですか?

2022-03-10 23:56:12

質問

base64エンコーディングにおけるパディングの目的は何ですか。以下は、wikipediaからの抜粋です。

追加のパッド文字が割り当てられており、これを使用してエンコード出力を4文字の整数倍(またはエンコードされていないバイナリテキストが3バイトの倍数でない場合は同等)に強制することができます。これらのパディング文字はデコード時に破棄されなければなりませんが、入力バイナリ長が3バイトの倍数ではない場合、エンコードされていないテキストの有効長の計算を可能にします(最後の非パッド文字は通常、それが表す最後の6ビットブロックの最下位ビットがゼロパッドされるようにエンコードされ、最大2文字のパッド文字はエンコードストリームの最後に発生するかもしれません)。 "。

任意の文字列をbase64エンコードし、任意のbase64エンコードされた文字列をデコードするプログラムを書きました。パディングはどのような問題を解決するのでしょうか?

どのように解決するのですか?

パディングは不要という結論は正しい。エンコードされた配列の長さから、入力の長さを曖昧さなく決定することは常に可能なのです。

しかし、例えば非常に単純なネットワークプロトコルのように、base64エンコードされた文字列を連結して個々の配列の長さが失われるような状況では、パディングが有効です。

もし パディングなし の文字列を連結した場合、個々の文字列の末尾の奇数バイトの情報が失われるため、元のデータを復元することは不可能である。しかし、パディングされた文字列を用いれば、曖昧さがなく、文字列全体として正しく復号することができる。

編集:図解

単語をbase64エンコードして連結し、ネットワークで送信するプログラムがあるとする。I"、AM"、TJM"をエンコードし、その結果をパディングなしで連結して送信します。

  • I にエンコードします。 SQ ( SQ== パディング付き)
  • AM にエンコードします。 QU0 ( QU0= パディング付き)
  • TJM にエンコードします。 VEpN ( VEpN パディング付き)

つまり、送信データは SQQU0VEpN . 受信者はこれを以下のようにBase64デコードします。 I\x04\x14\xd1Q) でなく、意図した IAMTJM . この結果はナンセンスで、送信者が 各単語がどこで終わるかの情報を破壊した をエンコードしたシーケンスで もし送信者が SQ==QU0=VEpN の代わりに、受信者はこれを3つの別々のbase64シーケンスとしてデコードし、それを連結することで IAMTJM .

なぜパディングが必要なのか?

なぜ、各単語の前に整数の長さを付けるようにプロトコルを設計しないのでしょうか?そうすれば、受信者はストリームを正しくデコードでき、パディングは不要になります。

それは素晴らしいアイデアです。 知る エンコードを開始する前に、エンコードするデータの長さを決定します。しかし、言葉ではなく、ライブカメラの映像の塊をエンコードしていたらどうでしょう?各チャンクの長さを事前に知ることはできないかもしれません。

もしプロトコルにパディングが使われていれば、長さを送信する必要は全くありません。カメラから送られてくるデータをそのままエンコードし、各チャンクをパディングで終了させれば、受信者はストリームを正しくデコードすることができるのです。

もちろん、これは非常に不自然な例ですが、なぜパディングが役立つ場合があるのかを説明することができます。