e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。
オンライン書籍; Microsoft .NET Web アプリケーションセキュリティ
第 8 章 : 暗号化(書籍のプレビュー)
Microsoft .NET Web アプリケーションセキュリティ
インデックス
- はじめに
- XOR 演算
- Base64 エンコード
- SHA1 CryptoServiceProvider
- MD5 CryptoServiceProvider
- RNG CryptoServiceProvider
- TripleDES CryptoServiceProvider
- Rijndael
- HMAC
- RSA CryptoServiceProvider
- web.config の暗号化
- 要約
インドの情報セキュリティの大家が書き下ろした最新のセキュリティ書籍の一部をオンライン書籍としてご紹介します。書籍の情報は、こちらをご覧ください。
TripleDESCryptoServiceProvider
c.cs
using System.Security.Cryptography;
using System;
using System.IO;
using System.Text;
class zzz
{
public static void Main()
{
TripleDESCryptoServiceProvider t = new TripleDESCryptoServiceProvid
er();
t.GenerateKey();
String sk = Convert.ToBase64String(t.Key);
Console.WriteLine("Key is {0}",sk);
t.GenerateIV();
String sIV = Convert.ToBase64String(t.IV);
Console.WriteLine("Initialization Vector is {0}",sIV);
ICryptoTransform ct;
MemoryStream m;
CryptoStream c;
byte[] b;
ct = t.CreateEncryptor(t.Key, t.IV);
b = Encoding.UTF8.GetBytes("Vijay");
m = new MemoryStream();
c = new CryptoStream(m, ct ,CryptoStreamMode.Write);
c.Write(b, 0, b.Length);
c.FlushFinalBlock();
c.Close();
String se = Convert.ToBase64String(m.ToArray());
Console.WriteLine("Encrypted String is {0}",se);
ct = t.CreateDecryptor(t.Key, t.IV);
b = Convert.FromBase64String(se);
m = new MemoryStream();
c = new CryptoStream(m, ct, CryptoStreamMode.Write);
c.Write(b, 0, b.Length);
c.FlushFinalBlock();
c.Close();
String sd = Encoding.UTF8.GetString(m.ToArray());
Console.WriteLine("Decrypted String is {0}",sd);
}
}
コマンド プロンプト ウィンドウ
C:\encrypt>c
Key is Y+S6gjQQ7RrZnXDItYB7SzRAlOEG3CTj
Initialization Vector is 5eTPY68ZnBU=
Encrypted String is o6xpIrRIfqY=
Decrypted String is Vijay
TripleDES は対称アルゴリズムを使用するので、データの暗号化と復号化に同じキーまたはパスワードが使用されます。.Net では TripleDESCryptoServiceProvider クラスにより実装されます。
キーは、TripleDESCryptoServiceProvider の GenerateKey という名前のメソッドを使用して生成します。TripleDES アルゴリズムでは 128 ~ 192 ビット長の強いキーが生成されますが、古い DES アルゴリズムでは 64 ビットのキーが作成されます。KeySize プロパティを使用することで、キーの実際のサイズを判別できます。表示のためにキーを Base64 文字列に変換しています。
キーを生成した後、GenerateIV メソッドを使用してもう 1 つのキー Initialization Vector (IV) を生成します。この IV は、暗号化プロセスでは使用されませんが、暗号化を行う前にデータのブロックを生成するためにアルゴリズムで使用されます。IV を使用しないと、文字列は他のアルゴリズムと同じ方法で暗号化されるので、キーが入手されると暗号が破られます。IV はランダム成分であり、最初のブロックの暗号化を開始します。したがって、キーが同じであっても IV が異なると、暗号化されたデータはまったく違うものになります。
もう一度例を使用してブロック暗号について説明します。テキスト Vijay を常に同じキー mukhi で暗号化すると、暗号化後のテキストはいつでも同じになります。したがって、テキスト内に出現する単語 Vijay はすべて同じ暗号テキストになり、暗号テキストが破られると、攻撃者は同じキーを使用して入力ストリームに戻すことができます。この問題を解決するためにこのアルゴリズムで採用されている方法は、暗号化が済んだ前のブロックを使用し、それをこれから暗号化するブロックと混合するというものです。2 つのブロック、つまり Vijay の 2 つの出現は、前にあるブロックが異なるので同じにはなりません。
前にブロックのない先頭ブロックの場合は、IV を使用してデータが暗号化されます。IV のサイズは、BlockSize プロパティと同じです。例では、IV を画面に表示しています。
プロバイダ クラスでは、CreateEncryptor メソッドを呼び出し、キーと IV を渡して、暗号化に使用される実際の TripleDES オブジェクトを作成しています。これらのオブジェクトはすべて、ICryptoTransform インターフェイスから派生します。
次に、暗号化するデータを渡します。バイト配列を渡す必要があるので、GetBytes メソッドを使用して文字列 Vijay を一連のバイトに変換します。
キーとデータが入手できたので、MemoryStream オブジェクトの m を作成します。MemoryStream は FileStream と似ていますが、ディスクではなくメモリ中のデータの読み取り/書き込みを行います。
最後に、MemoryStream オブジェクトの m、実際の TripleDES オブジェクトの ct、およびストリームのモードの Write を使用して、CryptoStream オブジェクトを作成します。Write モードは、暗号化されたデータをメモリ ストリームに書き込むために使用します。
暗号化を実際に行うには、TripleDES オブジェクト、ct の Write メソッドを使用します。このメソッドは、バイト配列をメモリ ストリームに書き込んで暗号化します。このタスクを実行するため、メソッドは、バイト配列、配列内のオフセット (先頭は 0)、およびバイト配列の長さを受け取ります。
つまり、Write 関数は、配列内のデータを暗号化し、暗号化された形式を MemoryStream に格納します。MemoryStream の代わりに FileStream オブジェクトを使用すると、暗号化されたデータがディスクに書き込まれます。
CryptoStream オブジェクトは、TripleDES オブジェクトとストリーム オブジェクトを関連付けます。遅延されている場合のある書き込みまたは暗号化を実行するには、Flush メソッドを使用します。また、プログラムで開いているオブジェクトを閉じることもお勧めします。その後、この MemoryStream を配列に変換してから、表示のために Base64 文字列に変換しています。
暗号化された文字列を復号化するには、同じキーと IV を指定して CreateDecryptor メソッドを呼び出します。これにより、TripleDES オブジェクトの ct が作成されます。その後、暗号化された値の Base64 エンコード文字列からバイト配列を取得します。次に、似た CryptoStream オブジェクトの c を作成します。このオブジェクトは、MemoryStream と TripleDES オブジェクトをリンクします。このクラスは、暗号を認識するオブジェクトにデータ ストリームをリンクするストリーム オブジェクトです。
再び、Write メソッドを使用し、暗号化されたデータを保持するバイト配列と MemoryStream を渡します。この関数は、データを復号化し、元のプレーン テキストを返します。
まとめると、キーを指定してプレーン テキストを暗号化すると暗号テキストが生成され、逆に、同じキーを暗号テキストに対して使用するとプレーン テキストが生成されます。
プログラムの最初の行を次のように変更します。
RC2CryptoServiceProvider t = new RC2CryptoServiceProvider();
次に示すコードは、RC2 アルゴリズムを使用して同じ文字列を暗号化します。他のコード行を変更する必要はありません。
コマンド プロンプト ウィンドウ C:\encrypt>c Key is HTqI49/9ucjhlf2apQx+bA== Initialization Vector is nB+TLMgyKDQ= Encrypted String is xU8bi8DP7Yo= Decrypted String is Vijay
.Net で暗号化クラスを使用する利点の 1 つは、これらはすべて同じパターンに従うので、1 つがわかっていれば、すべてを知っているといえることです。他のサービス プロバイダを自分で試してみたい場合は、ヘルプ ガイドが役に立ちます。



