8.C#による簡単な暗号化
C#(.NET Framework)では、CryptoAPIや次世代暗号化CNG(Cryptography Next Genaration)APIをラップしたクラスが提供されています。ここでは、C#でのサンプルと共に暗号化手順を説明します。
C言語でのCryptoAPIによる暗号化は、1.簡単な暗号化[http://www.trustss.co.jp/smnEasyEnc010.html]を、CNG APIによる暗号化は、1.14 ブロック暗号化アルゴリズムによる簡単な暗号化[http://www.trustss.co.jp/smnEasyEnc1E0.html]を参照してください。
C言語でのCryptoAPIによる暗号化は、1.簡単な暗号化[http://www.trustss.co.jp/smnEasyEnc010.html]を、CNG APIによる暗号化は、1.14 ブロック暗号化アルゴリズムによる簡単な暗号化[http://www.trustss.co.jp/smnEasyEnc1E0.html]を参照してください。
8.1 概要
トリプルDES暗号化アルゴリズムでの暗号化をCryptoStreamクラスを介して施します。このクラスは、Streamクラスを使って生成しますので、暗号化や復号を入出力に置き換えて処理することができます。8.2 サンプル コード
トリプルDES暗号化アルゴリズムでの暗号化を説明します。
using System; using System.Security.Cryptography; using System.Text; using System.IO; namespace DES3 { class TripleDES { static void Main(string[] args) { // (1)トリプルDES用の暗号化クラスを生成 // 鍵と初期ベクタは自動で生成 TripleDESCryptoServiceProvider des3alg = new TripleDESCryptoServiceProvider(); // 暗号化される文字列 string sData = "This is clear text data."; /* * 暗号化処理 */ // メモリStreamを介して暗号化するために MemoryStream mStream = new MemoryStream(); // (2)MemoryStreamを使ってCryptoStreamを生成 CryptoStream cStream = new CryptoStream(mStream, new TripleDESCryptoServiceProvider().CreateEncryptor( des3alg.Key, des3alg.IV), CryptoStreamMode.Write); // (3)暗号化される文字列をバイトアレイに変換 byte[] toEncrypt = new ASCIIEncoding().GetBytes(sData); // (4)CryptStreamに書き込んで暗号化 cStream.Write(toEncrypt, 0, toEncrypt.Length); cStream.FlushFinalBlock(); // 暗号化されたデータを取り出す byte[] Data = mStream.ToArray(); // クローズ cStream.Close(); mStream.Close(); /* * 復号処理 */ // 暗号化データを渡すためのメモリStreamを生成 MemoryStream msDecrypt = new MemoryStream(Data); // (5)MemoryStreamを使ってCryptoStreamを生成 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor( des3alg.Key, des3alg.IV), CryptoStreamMode.Read); // (6)復号されたバイト・データの領域 byte[] fromEncrypt = new byte[Data.Length]; // 復号されたデータをStreamから読み出す csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); // (7)バイトのデータをStringに変換する String Final = new ASCIIEncoding().GetString(fromEncrypt); // 復号したデータを表示 Console.WriteLine(Final); } } }
(1) トリプルDES用の暗号化クラスを生成
(2) MemoryStreamを使ってCryptoStreamを生成
(3)暗号化される文字列をバイトアレイに変換
TripleDES暗号化のインスタンスを生成します。このサンプルでは、共通鍵と初期化ベクタ(Initialize Vector)は自動生成させます。暗号化と復号で同じ値を使うために、このインスタンスの共通鍵と初期化ベクタを使用します。
共通鍵暗号化用のクラスは、以下が用意されています。
共通鍵暗号化用のクラスは、以下が用意されています。
- RijindaelManaged
- DESCryptoServiceProvider
- RC2CryptoServiceProvider
- TripleDESCryptoServiceProvider
(2) MemoryStreamを使ってCryptoStreamを生成
CryptoStreamクラスを使うことにより、暗号化されるデータの書き込みと、暗号データの読み出しといった単純な処理に置き換えることができます。パディングも必要に応じて実施されます。
CryptoStreamは、MemoryStreamばかりではなく、FileStreamNetwork、Streamなど、Streamクラスから発生したすべてのクラスを使って初期化できます。
CryptoStream初期化の際は、暗号化クラスを指定しそれを初期化します。暗号化クラスには、共通鍵と初期ベクタを指定しますが、その他は既定値を使用します。C#以外のアプリケーションで復号する場合は、既定値(以下)を使用してください。
CryptoStreamは、MemoryStreamばかりではなく、FileStreamNetwork、Streamなど、Streamクラスから発生したすべてのクラスを使って初期化できます。
CryptoStream初期化の際は、暗号化クラスを指定しそれを初期化します。暗号化クラスには、共通鍵と初期ベクタを指定しますが、その他は既定値を使用します。C#以外のアプリケーションで復号する場合は、既定値(以下)を使用してください。
- ブロックサイズ 64ビット
- フィードバックサイズ 8ビット
- 鍵サイズ 192ビット
- 暗号化モード CipherMode.CBC
- パディング PaddingMode.PKCS7
(3)暗号化される文字列をバイトアレイに変換
暗号化される文書が日本語を含んでいる場合など適切に変換(Encodingクラスなどを用いて)してください。
(4)CryptStreamに書き込んで暗号化 暗号化するデータをCryptoStreamに書き込んで暗号化します。
FlushFinalBlockメソッドによってバッファにある最後のブロックが暗号化されます。
(5)MemoryStreamを使って CryptoStream を生成FlushFinalBlockメソッドによってバッファにある最後のブロックが暗号化されます。
復号でもCryptoStreamを同じ暗号化クラス、同じ共通鍵と初期ベクタを使って初期化します。その他の設定値は既定値です。
(6)復号されたバイト・データの領域 復号されたデータを格納する領域を確保します。データの大きさは、暗号データのサイズを超えることはありませんし、パディングされたデータも高々ブロックサイズ以下ですので、こような処理で十分と思います。
(7)バイトのデータをStringに変換する 日本語が含まれている場合など、復号された結果は適切に変換しt下ください。
8.3 セキュリティ上重要な情報
サンプルコードには記述されていませんが、「セキュリティ上重要な情報」は、本来後始末が必要です。記載されたサンプルは、暗号化・復号アプリケーションとして動作します。しかし、「動作する」ことと、「使える」ことは必ずしも同じではありません。「使えるようにする」ためには、少なくとも以下のような後始末が必要です。
8.4 ご質問・ご要望
ご質問やご要望をお送りください。(匿名でも送信ください。ご質問やご要望内容は、公表しません。)
ご協力をお願いします、この記事は役に立ちましたか? | |
ご質問・ご要望 | |
メールアドレス | |
(記載の会社名および製品名は、各社の登録商標および商標です。)