2017-02-05 2 views
2

This postは、Base64でエンコードされた文字列が最大3文字になることを示しています(Anirudh Ramanathanの答えを参照)。 Web上の他の場所では、それが1つか2つの等号になることがあります。理論的に言えば、長さを4の倍数にする必要があるため、Anirudhの答えは正しいと思われます。これらの情報のどちらが間違っていますか?Base64でエンコードされた文字列の末尾に3等号を付けることはできますか?

brute-forceを使用して、Base64が3等号になる文字列を探してみましたが、10,000文字までの文字列を見つけることができませんでした。

ここではわかりませんか?

+1

これは間違っていました。彼は、文字列の長さは4の倍数でなければならないという要件に基づいており、最大3文字のパディング文字が必要であると仮定しています。彼が気づいていなかったのは、base64は常にパディングの前に偶数の文字を生成するということです。したがって、最大で2つのパディング文字が必要です。 FromBase64Stringにはバグがあります(http://stackoverflow.com/a/21203467/17034)。 –

+0

編集前のリンク先の回答はこちらhttp://stackoverflow.com/revisions/6309439/2 – Slai

答えて

0

次の表は、3つの入力バイトが4つのBase64文字にどのようにマッピングされるかを示しています。

 1  2  3     
8-bit: 111111112222222233333333 
Base64: 111111222222333333444444 
     1  2  3  4     

このモジュロ3の入力は、最適な符号化シナリオである:何ビット無駄とパディングを必要としないが存在しない:出力文字列は4つの文字です。

ここで、2つの入力バイトだけをエンコードする場合は、3つの出力文字が必要です。つまり、出力には1文字のパディング文字が追加され、合計4文字まで表示されます。

1つの8ビットのバイトである最小の空でない入力は、2つのBase64文字にエンコードされます。出力文字列を4文字にするには、2つのパディング文字が必要です。

出力が1文字である入力がないため、8ビットのバイト全体をエンコードしている限り、3つのパディング文字を使用する必要はありません。

2

いいえ、3 "="記号で終わることはできません。バイトが8ビット(2^8)、64 = 2^6を含むため、base64でエンコードされた文字列の4文字はすべて正確に3バイトを表します。したがって、ベース64符号化の4文字は、2^6 * 2^6 * 2^6 * 2^6ビットまで保持できます。これはちょうど2^8 * 2^8 * 2^8 = 3バイトです。 2^8> 2^6なので、1バイトを符号化するには、少なくとも2つの64進数の文字が必要です。それで、ベース64文字列は3文字のパディングを含むことはできません.1バイトは2文字+ 2パディング "="文字でエンコードされます。明らかに、2バイトは2つ以上のパディング文字を必要としない。 0と3バイトはパディングを全く必要としません。

+0

ありがとうございました。非常によく置く。 – dotNET

関連する問題