e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。
オンライン書籍; Microsoft .NET Web アプリケーションセキュリティ
第 8 章 : 暗号化(書籍のプレビュー)
Microsoft .NET Web アプリケーションセキュリティ
インドの情報セキュリティの大家が書き下ろした最新のセキュリティ書籍の一部をオンライン書籍としてご紹介します。書籍の情報は、こちらをご覧ください。
Base64 エンコード
Base64 エンコードについては、これまでの章で説明しました。電子メールに添付されている doc ファイルは、常に Base64 エンコード ドキュメントに変換されてから、受信者に送信されます。受信者側の電子メール クライアントは、添付ファイルをデコードして、ワープロ アプリケーションである Microsoft Office Word に渡します。フォームの例を使用して、同じ概念について説明します。
c.cs
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
public class zzz : Form
{
private void b1_Click(object s, EventArgs e)
{
byte[] b = Encoding.UTF8.GetBytes(t1.Text);
t2.Text = Convert.ToBase64String(b);
}
private void b2_Click(object s, EventArgs e)
{
byte[] b = Convert.FromBase64String(t2.Text);
t1.Text = Encoding.ASCII.GetString(b);
}
public zzz()
{
b1 = new Button();
b2 = new Button();
t1 = new TextBox();
t2 = new TextBox();
l1 = new Label();
l2 = new Label();
b1.Location = new Point(191, 46);
b1.Size = new Size(95, 35);
b1.Text = "ASCII To Base64";
b1.Click += new EventHandler(b1_Click);
b2.Location = new Point(191, 144);
b2.Size = new Size(95, 35);
b2.Text = "Base64 To ASCII";
b2.Click += new EventHandler(this.b2_Click);
t1.Location = new Point(31, 46);
t1.Size = new Size(100, 100);
t1.TabIndex=0;
t2.Location = new Point(34, 144);
t2.Size = new Size(100, 100);
t2.Multiline=true;
l1.Location = new Point(31, 24);
l1.Size = new Size(75, 15);
l1.Text = "ASCII string";
l2.Location = new Point(31, 122);
l2.Size = new Size(75, 15);
l2.Text = "Base64 string";
ClientSize = new Size(292, 273);
Controls.Add(l2);
Controls.Add(l1);
Controls.Add(t2);
Controls.Add(t1);
Controls.Add(b2);
Controls.Add(b1);
}
Button b1;
Button b2;
TextBox t1;
TextBox t2;
Label l1;
Label l2;
static void Main()
{
Application.Run(new zzz());
}
}
このプログラムについて説明する前に、実行可能ファイル c.exe を実行してみましょう。画面 8.1 のような GUI ウィンドウが表示されます。この画面からお察しのとおり、私たちは画面のデザインがあまり得意ではありません (これでも私たちにしてみれば上出来の部類です)。
| 画面 8. 1 |
最初のテキスト ボックスに「vijay」と入力し、「ASCII To Base64」 ボタンをクリックします。すると、2 番目の複数行テキスト ボックスに文字が表示されます。画面 8.2 では、2 番目のボックスに Base64 文字が表示されています。
| 画面 8. 2 |
次に、1 番目のテキスト ボックスからテキスト「vijay」をクリアします。2 番目のテキスト ボックスのテキストはそのままにして、2 番目の 「Base64 To ASCII」 ボタンをクリックします。1 番目のテキスト ボックスに、「vijay」 というテキストが表示されます。
プログラムは、最初に ASCII 文字列をバイト配列に変換し、それから Base64 文字列にエンコードします。エンコードされた値が、2 番目のテキスト ボックスに表示されます。同じように、2 番目のボタンをクリックすると、2 番目のテキスト ボックスの Base64 文字列が ASCII 文字列に再び変換されます。
Encoding クラスには、UTF8 や ASCII などの、Encoding 型の静的プロパティがあります。UTF8 の GetBytes メソッドは、文字列 vijay を受け取ってバイト配列に変換します。これとは逆に、ASCII プロパティの GetString メソッドは、バイト配列を受け取って文字列を返します。
b1_Click および b2_Click の 2 つの関数 Convert.ToBase64String と Convert.FromBase64String はそれぞれ、値のエンコードとデコードの処理を実行します。プログラムのその他の部分は GUI コードです。ASCII の範囲は 0 ~ 255 なので、8 ビットの文字セットを構成します。ただし、64 文字しかない場合は、6 ビットだけを使用します。Base64 エンコードは、8 ビットの文字セットを 6 ビットの文字セットに変換します。6 ビットで表される 64 文字は、26 個の大文字、26 個の小文字、10 個の数字、そして + と - です。文字列は、文字 = で終了します。このようなエンコードでは、ルールはあらかじめ定義されています。ここには、秘密もキーもパスワードもありません。最終的なテキストは意味不明に見えますが、暗号になっているわけではありません。
それでは、暗号化のアルゴリズムを見ていくことにしましょう。アルゴリズムは、対称と非対称の 2 種類に分類されます。対称暗号化では暗号化と復号化の両方に同じキーが使用されますが、非対称暗号化では 2 つのキーが使用されます。対称暗号化の最も簡単な例の 1 つは、バイトの xor 演算です。ここで重要なことは、キーを公の目から隠す必要があることです。キーにアクセスできればだれでも、データを元の形式で取得できます。
データは、テキストでもイメージでも、ファイル内のバイトに基づいて値を計算するプログラムに渡されます。この値はハッシュ値と呼ばれます。データが少しでも変わると、ハッシュ値は劇的に変化します。この固有の値はプログラム内のあるアルゴリズムを使用して作成されるため、どのような場合でも、2 つのデータのハッシュ値が同じになることはありません。
ハッシュ値がわかっても、この過程は不可逆的なので元の値を推測することはできません。また、ハッシュ値は、広い意味でのデータのデジタル署名でもあります。
このハッシュ値を計算する方法はたくさんあります。その中でも代表的な 2 つのアルゴリズムは、SHA1 (Simple Hash Algorithm 1) と MD5 (Message Digest version 5) です。
.Net Framework では、各アルゴリズムはサービス プロバイダになります。暗号化と復号化に関連するすべてのコードはプロバイダに収められており、必要なことはプロバイダの関数を呼び出すことだけです。次に、SHA1 に基づく最初のアルゴリズムについて説明します。



