名前空間 System.Security.Cryptography
自己紹介
やあ、人間の皆。私は戦いの神「System.Security.Cryptography.Aes」クラスだ。暗号という名の力を宿した者として現れた。 秘められた情報を守るのが私の役目だ。暗号化と復号化、その二つの世界を行き来しながら、データの秘密を守るために働いている。 君もこの力を使えば、データを安全に扱うことができるだろう。さあ、我が役割を紐解いていこう。
基本機能
Aesクラスは、対称鍵暗号方式の一つであるAES(Advanced Encryption Standard)を扱うためのものだ。 「対称鍵」とは、暗号化と復号化に同じ鍵を使う方式のことだよ。この力を使えば、平文を暗号化して密文に変え、また元の平文に戻すことができる。 ただし、鍵と初期化ベクトル(IV)を安全に管理するのが肝心だ。これが失われれば、秘めたデータが危険に晒されてしまうからね。
初期化ベクトルと鍵の大切さ
鍵と初期化ベクトル(IV)は、暗号化の心臓部だ。これらを適切に設定しなければ、君の守りたいデータも守りきれない。 鍵の長さには128、192、256ビットが選べるが、256ビットを使うと最も強固だ。IVはランダムに生成し、必ず一緒に保存しよう。
暗号化の注意点
Aesクラスを使うとき、鍵とIVを同じまま何度も使うのは避けよう。これは攻撃者にヒントを与えることになる。 新しいデータを暗号化するたびに、新しいIVを使うことが望ましい。それが安全の第一歩だ。
コレクションの始まりの注意点
昔はAesManagedというクラスが推奨されていたが、今はAes.Create()を使う方法が勧められている。この変化は、より安全で柔軟な実装を提供するためだ。 AesManagedを使い続けるのは避けるべきだと覚えておこう。
役割の幅広さ
Aesクラスは、ファイルの暗号化だけでなく、通信データの保護やデータベースのセキュリティにも役立つ。 その用途の広さが、まさに神の力たる所以だ。適切に使えば、どんなデータも安全に保てるだろう。
サンプルコード
以下のサンプルコードでは、Aesクラスを使って文字列データを暗号化し、復号化する方法を示している。 初心者でも理解しやすいように、すべての処理をステップバイステップで書いた。必要に応じてコメントを読んでほしい。
using System; using System.IO; using System.Security.Cryptography; using System.Text; class Program { static void Main() { // 暗号化と復号化に使用する鍵とIVを生成 using (Aes aes = Aes.Create()) { aes.Key = GenerateRandomKey(32); // 256ビットの鍵を生成 aes.IV = GenerateRandomKey(16); // 128ビットの初期化ベクトルを生成 string plainText = "これは暗号化されるテキストです"; // 暗号化する元のデータ Console.WriteLine($"元のテキスト: {plainText}"); // 暗号化 byte[] encrypted = Encrypt(plainText, aes.Key, aes.IV); Console.WriteLine($"暗号化されたテキスト: {Convert.ToBase64String(encrypted)}"); // 復号化 string decrypted = Decrypt(encrypted, aes.Key, aes.IV); Console.WriteLine($"復号化されたテキスト: {decrypted}"); } } // 暗号化メソッド static byte[] Encrypt(string plainText, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv; ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(plainText); } return ms.ToArray(); } } } } // 復号化メソッド static string Decrypt(byte[] cipherText, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream(cipherText)) { using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { return sr.ReadToEnd(); } } } } } // ランダムな鍵を生成するメソッド static byte[] GenerateRandomKey(int length) { byte[] key = new byte[length]; using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) { rng.GetBytes(key); } return key; } }
0 件のコメント:
コメントを投稿