SGVsbG8gd29ybGQhまたはbase64履歴

簡単な背景



一般に、それはずっと前に始まりました。 ずっと前に、1バイトにいくつのビットを入れるかが決定された当時の聖戦の目撃者はほとんどいません。



1バイト= 8ビット、256バイトの異なる値を1バイトでエンコードできることは当たり前のように思えます。 しかし、かつてはそうではありませんでした。 歴史は、7ビットエンコーディング、6ビット、およびさらにエキゾチックなシステムを覚えています(たとえば、3進論理、つまり1つの3進ビットを使用したSetunコンピューター-tritは、2つの値ではなく3つの値を持つことができます。 = 6トリタム)。 しかし、すべてのエキゾチックなものを別にしても、メインストリームには、1バイトで6、7、または8ビットのエンコーディングがまだありました。



6ビットエンコーディング(BCDなど)を使用すると、64文字の異なる値を1バイトでエンコードできました。これは、英数字のエンコードに十分であると思われ、「余分な」7ビット目でエンコードが128文字に拡張されました。



ただし、8ビットバイトはすぐに一般的に受け入れられるようになりました。



8ビットの問題



事実上の標準として8ビットエンコーディングを採用すると、多くの問題が発生します。 この時点で、正確に7ビットエンコーディングを使用する特定のインフラストラクチャがすでに存在し、聖戦は新たな活力で燃え上がりました。



それらは、電子メールシステムの「8ビットトリミング」の問題の形で私たちにやって来ました。 8ビットバイトの承認により、1バイトに256の異なる値が与えられました。これにより、共通の記号(数字、句読点、ラテン文字)とキリル文字などの文字を1つのコードテーブルに収めることができました。 それは思えます-非常に便利で、テキストはロシア語の文字でも、英語でも入力でき、必要であれば、ドイツのウムラウトのための場所があります!



しかし、いつものように、悪魔は細部にいた。 すでに蓄積され動作しているhard-n-softwareは、多くの場合7ビットエンコーディングに適合しており、さまざまな問題を引き起こしました。



たとえば、メールサーバーは、手紙を送信するときに、メッセージの各バイトの最上位ビットを非常に簡単にリセットできますが、これは問題を引き起こす可能性がありますが、多くの場合、情報は壊滅的に失われました。



この問題の一時的な解決策として、いくつかのオプションが提案されました。 それらの1つは、エンコーディング「KOI-8」でした。 私が認めなければならない解決策は非常にエレガントです-このエンコーディングでは、ロシア語の文字はラテン語の順序で配置され、同じ最上位ビットがまったく異なっていました。 したがって、このビットを切ると、ロシア語の「A」はラテン語の「A」に、「B」は「B」に、といった具合に、メッセージは単に音訳され、それでも読むことができました。 確かに、これはクローゼットにスケルトンがなければできなかったでしょう。ロシア語のアルファベット順に「KOI」でソートするのは悪夢になりました...



そして、他の言語、人々、コーディングに対して何が行われたのでしょうか? バイナリデータはどうですか? 同じように、音訳エンコーディングは基本的な問題を解決しませんでした-8ビット目の損失、情報の一部の損失。 そのため、Base64のエンコード(またはアルゴリズム)が誕生しました。



Base64アルゴリズム



base64の概念は単純です-回復の可能性を備えた可逆エンコードは、8ビットコードテーブルのすべての文字を、ネットワークおよびデバイス間でデータを送信するときに保持されることが保証されている文字に変換します。



このアルゴリズムは、3の8ビット(24)を4つのシックス(これも24)に減らし、これらのシックスをASCII文字の形式で表すことに基づいています。 したがって、可逆暗号化が得られます。唯一の欠点は、エンコード時にサイズが大きくなることです(4:3の比率)。



例:

ロシア語のテキスト「ABVGD」を取ります。 Windows-1251でエンコードされたバイナリ形式では、5バイトを取得します。

11000000

11000001

11000010



11000011

11000100

(00000000)-合計ビット数を6で割るために、余分なゼロバイトが必要です



これらのビットを6つのグループに分割します。

110000

001100

000111

000010



110000

111100

010000

000000



文字の配列「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /」を取得し、配列インデックスとして使用して、結果の数値をこれらの文字に変換し、「wMHCw8Q」を取得します。 最初のステップで追加した1バイトの余分なゼロバイトを示すために、最後に1文字「=」を追加するだけで、最終結果が得られます。



「ABVGD」:base64 = "wMHCw8Q ="



逆変換も同様に簡単です。たとえば、この記事のタイトルにあるものを解読してみてください。



申込み



base64アルゴリズムは、電子メールの添付ファイルをエンコードする場合など、情報の慎重な処理を保証する方法がない今日でもまだ使用されています。 PGPでは、base64アルゴリズムを使用してバイナリデータをエンコードします。



base64の他の使用法を想像できます-たとえば、データベースに保存するとき、環境が事前にわからない場合(ああ、PHPのこれらのmagic_qoutes!)そして、インデックス付けとテキスト検索の必要がない場合、base64を使用できます。



base64は、システム内のユーザーのパスワードなどのデータが以前にbase64に変換されている場合、ハッシュテーブル選択に対する手段として、たとえばmd5アルゴリズムを使用してハッシュを取得するために使用できます。



最後にデータURI



参照資料



en.wikipedia.org/wiki/Base64

base64.ru



All Articles