C#の文字列を暗号化・復号化する方法を学ぼう!初心者でもわかる基本の仕組み
生徒
「先生、C#で文字列を暗号化する方法ってあるんですか?例えば、パスワードとかを安全に保存したいときに使うやつです。」
先生
「とても大事なポイントですね。C#では、文字列を暗号化して安全に扱うことができます。逆に、暗号化された文字を元に戻すこともできるんですよ。」
生徒
「暗号化って、なんだか難しそうです…数字や記号がぐちゃぐちゃになるイメージです。」
先生
「そのイメージは正しいですよ!でも仕組みは意外とシンプルなんです。今日は、C#で文字列を暗号化・復号化する基本を、初心者でも理解できるように説明していきましょう。」
1. 暗号化とは?復号化とは?
まず、暗号化(Encryption)とは、「読める文字列を読めない形に変換すること」です。たとえば「apple」という文字を「Qw3sd!@」のような形に変えることで、第三者が内容を理解できなくします。
そして、復号化(Decryption)とは、暗号化された文字列をもとの文字列に戻すことを指します。暗号化と復号化は、ちょうど鍵をかける・鍵を開けるの関係に似ています。
パソコンやスマホの世界では、パスワード、クレジットカード情報、個人情報などを守るために、この暗号化技術が使われています。
2. C#で使える暗号化の方法
C#には、暗号化を簡単に行うための便利なクラスが用意されています。代表的なのが、Aesクラスです。AES(エーイーエス)とは、「Advanced Encryption Standard(高度暗号化標準)」の略で、非常に強力で安全な暗号方式として広く使われています。
たとえば、C#のSystem.Security.Cryptographyという名前空間(機能をまとめたフォルダのようなもの)を使えば、簡単に文字列を暗号化できます。
3. 実際にC#で文字列を暗号化・復号化してみよう
では、実際のサンプルコードを見てみましょう。ここでは、文字列をAES方式で暗号化し、また元の文字列に戻す復号化も行います。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
string original = "CSharp123!";
string key = "1234567890123456"; // 16文字の鍵
string iv = "6543210987654321"; // 初期化ベクトル
string encrypted = EncryptString(original, key, iv);
Console.WriteLine("暗号化された文字列: " + encrypted);
string decrypted = DecryptString(encrypted, key, iv);
Console.WriteLine("復号化された文字列: " + decrypted);
}
static string EncryptString(string plainText, string key, string iv)
{
using Aes aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = Encoding.UTF8.GetBytes(iv);
using MemoryStream memoryStream = new();
using CryptoStream cryptoStream = new(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
using StreamWriter writer = new(cryptoStream);
writer.Write(plainText);
writer.Close();
return Convert.ToBase64String(memoryStream.ToArray());
}
static string DecryptString(string cipherText, string key, string iv)
{
using Aes aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = Encoding.UTF8.GetBytes(iv);
using MemoryStream memoryStream = new(Convert.FromBase64String(cipherText));
using CryptoStream cryptoStream = new(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
using StreamReader reader = new(cryptoStream);
return reader.ReadToEnd();
}
}
このコードでは、まず文字列を暗号化し、次にそれを復号化して元の文字列に戻しています。
実行結果
暗号化された文字列: 6u8cF0W7eN+/b+3kNxTbxA==
復号化された文字列: CSharp123!
4. コードの仕組みをわかりやすく解説
このサンプルコードの中では、C#の標準ライブラリを使って暗号化と復号化を行っています。少し難しそうに見えますが、流れを理解すればとてもシンプルです。
- 1. 鍵(Key)とIV(初期化ベクトル)を設定:暗号化のために、16文字の「鍵」と「IV(イニシャルベクトル)」を指定します。どちらも重要な情報で、これが一致しないと復号化できません。
- 2. Aesクラスを生成:
Aes.Create()でAES暗号化の機能を使えるようにします。 - 3. CryptoStreamを使って暗号化処理:通常の文字列を書き込むようにして、暗号化されたバイトデータをメモリに出力します。
- 4. Convert.ToBase64Stringで変換:バイトデータを文字列に変換して表示できるようにします。
そして復号化の流れは、この逆の処理になります。暗号化された文字列をFromBase64Stringでバイトに戻し、AESの復号機能で元の文字列に変換します。
5. 暗号化の注意点
暗号化を使うときに注意すべきことがいくつかあります。
- 鍵とIVは絶対に外部に漏らさない:これらが知られると、誰でも簡単に復号化できてしまいます。
- 鍵はアプリに直接書かない:実際のアプリ開発では、鍵を設定ファイルや安全な環境変数に保存します。
- 暗号化の種類を理解する:今回のAESは「共通鍵暗号方式」と呼ばれ、暗号化と復号化で同じ鍵を使います。
このように、C#では安全な情報管理のために強力な暗号化機能が用意されています。プログラミング初心者でも、基本を押さえれば安心して使うことができます。
6. Base64とは?
暗号化の結果は、コンピュータ内部の「バイト列(byte array)」という形になります。そのままでは画面に表示できないため、Base64(ベース64)という形式に変換します。これは、数字や英字・記号を使って安全に文字列化する方法です。
このBase64形式は、メール送信やファイル転送など、データを安全に扱う場面でもよく使われます。
7. 暗号化を使った身近な例
例えば、Webサイトのログイン機能で入力されたパスワードは、直接保存せず、暗号化された形でデータベースに記録されます。もし外部からデータが盗まれても、暗号化されているため、内容を読み取ることはできません。
C#の暗号化機能を理解しておくことで、安全なアプリケーションを作る第一歩になります。