web-dev-qa-db-ja.com

暗号化されたメッセージが「==」で終わることがあるのはなぜですか

プログラミングの練習として、メッセージを復号化する必要があります。私が持っている唯一の手がかりはそれがそうであるということです:

  • エンコードされたメッセージには、Base64文字のみが含まれます
  • n文字シーケンス(nは1,4,7,10)回、「==」で暗号化されたメッセージを返します。
  • n文字シーケンス(2、5、8、11のn)回、「=」で暗号化されたメッセージを返します。
  • n文字シーケンス(3、6、9、12のn)は、特定の文字なしで暗号化されたメッセージを返します。

解決策は必要ありません。この等号の一連の出現が手掛かりを提供するかどうか疑問に思っています。

ありがとうございました。

23
czioutas

=記号は Base64 でエンコードされる文字列の長さに関係します。基本的に、おそらくBase64の最も一般的な形式では、最後のブロックが適切にデコードできるようにするために、=がパディング文字として使用されます。

Base64は暗号化ではありません-隠蔽は行われていませんが、バイナリデータをテキストのみの形式で送信できるようにするためによく使用されます。 Base64で使用されるすべての文字が正しく貼り付けられ、Shiftキーを超える修飾キーのないキーボードを使用して入力できます。

53
Matthew

上記のように、Base64は暗号化ではなくエンコーディングです。標準を指定した [〜#〜] rfc [〜#〜] を見るとわかるように、base64は次のように動作します。

  • 文字のストリームs、の長さn。があります
  • ストリームから3つの8ビット値を読み取ります(これで、合計24ビット= 3バイトになります)
  • これらの24ビットを、それぞれ6ビットの4つのグループに分割します。
  • Base 64アルファベットのテーブルを使用して、6ビットグループのそれぞれをBase64相当にエンコードします。

これで、ストリームの最後に到達し、24ビットグループが存在しない可能性があります(s mod 6!= 0)。これが発生した場合は、6ビットグループの整数になるまで、入力の最後にゼロを追加します。

入力ストリームがASCIIエンコードされているため、8ビット文字で構成されているとすると、上記のシナリオで終わるケースは2つだけです。

1)最後のグループに8ビットあります

2)最後のグループに16ビットあります

最初のケースでは、4つのゼロが追加され(12ビットが与えられます)、出力はアルファベットに基づいてエンコードされた2文字(2 * 6ビット= 12ビット)と2つの「=」パディング文字になります。

2番目のケースでは、2つのゼロが追加され(合計18ビットが与えられます)、出力は3文字(3 * 6ビット= 18ビット)と1つの「=」パディング文字になります。

エンコードされたテキストの最後に「=」が1つ、2つ、またはまったくない場合があります。詳細については、その標準とそれに関連するWikipediaエントリを定義した [〜#〜] rfc [〜#〜] を実際に読んでください。

3
G. Kaklam.