カテゴリ: C# 更新日: 2026/06/25

C#で暗号化と復号化をマスター!AES・RSAの使い方を初心者向けに徹底解説

C#の暗号化と復号化の基本(AES・RSAの使い方)
C#の暗号化と復号化の基本(AES・RSAの使い方)

先生と生徒の会話形式で理解しよう

生徒

「C#を使って大切なデータを他の人に見られないように隠す方法ってありますか?」

先生

「C#にはデータを守るためのセキュリティ機能として、暗号化と復号化という仕組みが用意されています。」

生徒

「暗号化とか復号化って難しそうですね。私にも理解できますか?」

先生

「大丈夫ですよ!基本的な考え方から、AESやRSAという有名な方法の使い方まで、分かりやすく順番に解説していきますね。」

生徒

「それでは、具体的な使い方を見ていきましょう!」

先生

「はい、まずは一番大切な基本の言葉の意味から学んでいきましょう!」

1. 暗号化と復号化の基本とは

1. 暗号化と復号化の基本とは
1. 暗号化と復号化の基本とは

インターネットを利用して買い物をしたり、秘密のメッセージを送ったりするとき、その内容が途中で誰かに盗み見られたら大変ですよね。そこで必要になるのが、暗号化(あんごうか)復号化(ふくごうか)という技術です。プログラミングにおいて、セキュリティを高めるためには必須の知識となります。

暗号化とは、普段私たちが読んでいる普通の文字や数字などのデータ(これを平文(ひらぶん)と呼びます)を、特別な計算によって、誰が見ても意味が分からない意味不明な文字の羅列(これを暗号文(あんごうぶん)と呼びます)に変換することです。パソコンを触ったことがない方でも、学校の秘密基地で友達同士しか分からない合言葉を作った経験はありませんか。それと同じようなことを、パソコンにやらせるのが暗号化です。

一方で、復号化とは、その意味不明になってしまった暗号文を、元の読める状態のデータ(平文)に戻す作業のことです。よく「復号化」を「複合化」と書き間違えてしまう人がいますが、正しくは「元の状態に戻す」という意味の漢字を使って「復号」と言いますので、しっかりと覚えておきましょう。C#というプログラミング言語を使えば、この複雑に見える変換処理をとても安全に、そして簡単なプログラムで実現することができます。

2. 暗号化に欠かせない鍵の仕組み

2. 暗号化に欠かせない鍵の仕組み
2. 暗号化に欠かせない鍵の仕組み

データを暗号化したり、元に戻したりするときには、必ず鍵(かぎ)というものが必要になります。本物の家のドアにかける鍵をイメージしてください。ドアを閉めて鍵をかけることで、泥棒が中に入れなくなりますよね。そして、家の中に入りたいときは、正しい鍵を使ってガチャリと開けます。プログラミングの世界でもこれと全く同じ仕組みを利用しています。

パソコンの世界における鍵は、本物の金属の鍵ではなく、目に見えない複雑な数字や文字の組み合わせでできたデータです。この鍵のデータを使って、プログラムが計算を行うことで、文章をぐちゃぐちゃにしたり元に戻したりします。どれだけ強力な暗号化の方法を使ってデータを隠しても、この鍵が他人に盗まれてしまったら、簡単に中身を読まれてしまいます。そのため、セキュリティのプログラムを作るときは、データをどうやって隠すかだけでなく、この鍵をどのように厳重に管理するかがとても重要になってきます。

暗号化の仕組みには、大きく分けて二つの種類があります。一つは「暗号化するとき」と「元に戻すとき」に同じ鍵を使う方法。もう一つは、それぞれで違う鍵を使う方法です。この二つの違いを理解することが、C#のセキュリティプログラムをマスターするための第一歩になります。

3. 共通鍵暗号方式とAESの特徴

3. 共通鍵暗号方式とAESの特徴
3. 共通鍵暗号方式とAESの特徴

まずは、一つ目の仕組みである共通鍵暗号方式(きょうつうかぎあんごうほうしき)について解説します。これは、データを暗号化するときに使う鍵と、暗号化されたデータを元に戻す(復号化する)ときに使う鍵が、完全に同じものである方式です。例えるなら、一つの宝箱に対して、鍵が一つだけある状態です。その鍵で宝箱を閉めて、開けるときもその同じ鍵を使います。

この共通鍵暗号方式の中で、現在世界中で最も広く使われている代表的な規格がAES(エーイーエス)です。AESは非常に安全性が高く、なおかつパソコンに大きな負担をかけずに、とても高速に暗号化と復号化の計算ができるという素晴らしい特徴を持っています。そのため、大きなファイルや、たくさんの文字データを一気に隠したいときに大活躍します。

しかし、共通鍵暗号方式には一つだけ大きな弱点があります。それは、遠くにいる友達に暗号化したデータを送って読んでもらいたいとき、そのデータを元に戻すための鍵も一緒に相手に渡さなければならない点です。もし鍵をインターネットのメールなどで送ろうとしたとき、そのメール自体がハッカーに盗み見られてしまったら、鍵が相手に渡ってしまいます。そうなると、せっかく暗号化したデータも簡単に開けられてしまいますよね。この、鍵を安全に相手に渡すのが難しいという問題を鍵配送問題(かぎはいそうもんだい)と呼びます。

4. C#でAESを使って暗号化してみよう

4. C#でAESを使って暗号化してみよう
4. C#でAESを使って暗号化してみよう

それでは、実際にC#のプログラムを使って、AESによる共通鍵暗号化を試してみましょう。C#には、最初から安全な暗号化の計算を行うための部品が用意されています。今回は、画面に文字を出力する最もシンプルなプログラムを作成しました。初心者の方でも分かりやすいように、短い文字を暗号化する流れを体験してみましょう。


using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main()
    {
        string originalText = "ひみつのメッセージ";
        
        using (Aes myAes = Aes.Create())
        {
            byte[] encrypted = EncryptStringToBytes_Aes(originalText, myAes.Key, myAes.IV);
            string roundTrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

            Console.WriteLine("元の文字: " + originalText);
            Console.WriteLine("暗号化された配列の長さ: " + encrypted.Length);
            Console.WriteLine("元に戻した文字: " + roundTrip);
        }
    }

    static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
    {
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (ICryptoTransform encryptor = Aes.Create().CreateEncryptor(Key, IV))
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    return msEncrypt.ToArray();
                }
            }
        }
    }

    static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (ICryptoTransform decryptor = Aes.Create().CreateDecryptor(Key, IV))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadLine();
                    }
                }
            }
        }
    }
}

このプログラムを実行すると、パソコンの内部で自動的に安全な鍵が作られ、文字データが一度バラバラの数字のデータに変換されたあと、再び元の正しい文字へと戻されます。プログラム内に出てくるIVというのは初期化ベクトルと呼ばれるもので、暗号のパターンを毎回ランダムに変えて、より解読されにくくするための補助的な鍵のようなものです。上記のコードを実行した結果は、以下のようになります。


元の文字: ひみつのメッセージ
暗号化された配列の長さ: 32
元に戻した文字: ひみつのメッセージ

5. 公開鍵暗号方式とRSAの特徴

5. 公開鍵暗号方式とRSAの特徴
5. 公開鍵暗号方式とRSAの特徴

共通鍵暗号方式の弱点であった「鍵を相手に安全に渡すのが難しい」という問題を、見事に解決したのが公開鍵暗号方式(こうかいかぎあんごうほうしき)です。これは、暗号化するときと、元に戻す(復号化する)ときに、まったく別の2つの鍵ペアを使うという驚きの仕組みです。この2つの鍵は、公開鍵(こうかいかぎ)秘密鍵(ひみつきぎ)と呼ばれます。

分かりやすく例えるなら、誰でも自由に配ることができる「開いた状態の南京錠」が公開鍵で、その南京錠をガチャンと閉めたあとに、自分だけが開けることができる「本物の鍵」が秘密鍵です。あなたが友達から秘密のメッセージを受け取りたいときは、まず開いた状態の南京錠(公開鍵)を友達に送ります。これは誰に見られても問題ないので、インターネットで堂々と送ることができます。友達はその南京錠を使って箱に大切な手紙を入れ、ガチャンと鍵を閉めてあなたに送り返します。閉まった南京錠を開けられるのは、世界中であなただけが持っている秘密鍵だけです。これなら、途中で誰かに泥棒されても、中身を開けられる心配がありません。

この公開鍵暗号方式の中で最も有名な規格がRSA(アールエスエー)です。桁数がものすごく大きい素数という数字を使った数学的な計算をもとにして作られており、現代のインターネットセキュリティの基盤となっています。ただし、RSAは非常に複雑な計算を行うため、AESに比べると処理のスピードがとても遅いというデメリットがあります。そのため、普段の通信では、この2つの良いところを組み合わせたハイブリッドな方法が使われています。

6. C#でRSAを使って暗号化してみよう

6. C#でRSAを使って暗号化してみよう
6. C#でRSAを使って暗号化してみよう

それでは、C#でRSAを使ってデータを守るプログラムを書いてみましょう。C#ではRSACryptoServiceProviderという部品を使うことで、簡単に公開鍵と秘密鍵のペアを作り出し、それらを使った高度なセキュリティ処理を行うことができます。今回は、文字列を一度完全に暗号化し、それを再び復号化して中身を表示する一連の流れを一つのプログラムにまとめました。


using System;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main()
    {
        string rawMessage = "ここだけの秘密です";
        byte[] dataToEncrypt = Encoding.UTF8.GetBytes(rawMessage);

        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);
            byte[] decryptedData = rsa.Decrypt(encryptedData, false);

            string finalResult = Encoding.UTF8.GetString(decryptedData);

            Console.WriteLine("暗号化前: " + rawMessage);
            Console.WriteLine("暗号化後のデータ(バイト数): " + encryptedData.Length);
            Console.WriteLine("復号化後: " + finalResult);
        }
    }
}

このプログラムでは、まず「ここだけの秘密です」という日本語の文字を、パソコンが理解できるバイトデータという数字の集まりに変換しています。そのあと、RSAの機能を使って強力に暗号化し、最後にまた元の文字に戻しています。実行すると、途中でデータがしっかりと守られながら、無事に元のメッセージが取り出せることが確認できます。出力結果は以下の通りです。


暗号化前: ここだけの秘密です
暗号化後のデータ(バイト数): 128
復号化後: ここだけの秘密です

7. 文字データとバイトデータの変換

7. 文字データとバイトデータの変換
7. 文字データとバイトデータの変換

これまでのプログラムの中で、文字をそのまま暗号化するのではなく、何か怪しげな変換を行っていることに気づいた方もいるかもしれません。実は、パソコンの内部では、私たちが読んでいる「あ」や「い」といった文字を直接理解しているわけではありません。すべてのデータは「0」と「1」の組み合わせである、デジタルな数値の集まりとして処理されています。この数値の集まりのことをバイトデータバイト配列と呼びます。

C#で暗号化や復号化の命令を出すときは、必ずこの「バイトデータ」の形に変換してから、暗号化の部品にデータを渡す必要があります。文字のデータをバイトデータに変換することをエンコードと呼び、逆にバイトデータを人間の読める文字に戻すことをデコードと呼びます。この変換を行うために、C#ではEncoding.UTF8.GetBytesEncoding.UTF8.GetStringといった便利な命令が用意されています。

プログラミング初心者の方が最初につまずきやすいのが、このデータ形式の変換です。「なぜ文字を直接暗号化できないの?」と難しく考えてしまうかもしれませんが、これは「英語しか話せない暗号計算機に、日本語を一度英語の数字に直して通訳してから渡している」ようなものだと考えてください。このルールさえ覚えておけば、どのような文字データであっても、安全に暗号化の手続きを進めることができるようになります。

8. 安全なプログラムを作るための注意点

8. 安全なプログラムを作るための注意点
8. 安全なプログラムを作るための注意点

最後に、C#でセキュリティプログラムを作るときに、絶対にやってはいけない大切な注意点をお伝えします。どれだけ優れたAESやRSAのコードを書いても、運用の仕方を間違えるとハッカーに簡単にデータを盗まれてしまいます。まず一番大切なのは、プログラムのコードの中に、直接鍵となるパスワードのような文字を書き込まないことです。これをハードコーディングと呼び、初心者が最もやってしまいがちな危険なミスの一つです。プログラムのファイル自体が誰かに見られたとき、鍵が丸見えになってしまいます。

また、暗号化の技術は日進月歩で進化しています。大昔に安全だと言われていた方法(例えばDESと呼ばれる古い暗号方式など)は、現在の高性能なパソコンを使うと、一瞬で暗号が解読されてしまうため、今では絶対に使ってはいけないことになっています。新しくて安全な規格であるAESやRSAを正しく選び、常に最新のセキュリティ情報を確認する姿勢が、本物のプログラマーへの道へと繋がります。

さらに、自分で独自の暗号化の計算方法を適当に作ってしまうことも非常に危険です。「自分にしか分からない方法だから安全だろう」と思いがちですが、プロの暗号解読者から見れば、素人が作った暗号はすぐにパターンが見破られてしまいます。C#に標準で用意されている、世界中の天才数学者たちが安全性を認めた本物の部品をそのまま正しく使うことこそが、最も確実で安全なシステムを作る近道なのです。

カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのデバッグ方法を徹底解説!初心者向けDISPLAY活用ガイド
New2
C#
C#のLINQでグループ化と集計!GroupByとCountを初心者向けに解説
New3
C#
C#のシングルトンパターン実装方法と注意点を徹底解説!初心者向け完全ガイド
New4
Azure
Azure WAFの誤検知を解消!除外リスト設定とチューニング方法を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.2
Java&Spring記事人気No2
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.3
Java&Spring記事人気No3
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
No.4
Java&Spring記事人気No4
C#
C#のトランザクション処理を完全ガイド!初心者でもわかるCommit・Rollbackの使い方
No.5
Java&Spring記事人気No5
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.6
Java&Spring記事人気No6
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.7
Java&Spring記事人気No7
Azure
Azureストレージの冗長性比較!LRS/GRS/ZRSの選び方とコストの最適解を完全解説
No.8
Java&Spring記事人気No8
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド