C#

C#でAES暗号化をやってみる

はじめに

C#でAES暗号化をやってみました。

コードだけを書いてもよかったのですが、暗号について何も知らないとコードの理解も進まないと思うので最低限の知識を書いておきます。
最終的には、AES-256(CBC)で暗号化するコードを書いています。

コード

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

namespace AESSample
{
    class Program
    {
        /// <summary>
        /// 文字列をAESで暗号化
        /// </summary>
        /// <param name="text">暗号化したい文字列</param>
        /// <returns>Base64形式で暗号化された文字列</returns>
        private string Encrypt(string text)
        {
            // 初期化ベクトル            ----- (4)
            const string AesIV = @"<半角16文字(1byte=8bit, 8bit*16=128bit>";
            // 暗号化鍵
            const string AesKey = @"<半角32文字(8bit*32文字=256bit)>";

            // 暗号化方式はAES           ----- (1)
            AesManaged aes = new AesManaged();
            // 鍵の長さ                  ----- (2)
            aes.KeySize = 256;
            // ブロックサイズ(何文字単位で処理するか)
            aes.BlockSize = 128;
            // 暗号利用モード             ----- (3)
            aes.Mode = CipherMode.CBC;
            aes.IV = Encoding.UTF8.GetBytes(AesIV);
            aes.Key = Encoding.UTF8.GetBytes(AesKey);
            // パディング                 ----- (5)
            aes.Padding = PaddingMode.PKCS7;

            // 暗号化するためにはバイトの配列に変換する必要がある
            byte[] byteText = Encoding.UTF8.GetBytes(text);

            // 暗号化
            byte[] encryptText = aes.CreateEncryptor().TransformFinalBlock(byteText, 0, byteText.Length);

            // Base64形式(64種類の英数字で表現)で返す
            return Convert.ToBase64String(encryptText);
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            // 暗号化
            string encryptStr = p.Encrypt("Hello World!");

            Console.WriteLine("暗号化後の文字列:{0}", encryptStr);

            Console.ReadLine();
        }
    }
}

1.暗号化の方法

暗号化の方法にはいくつかのやり方があります。

  • DES(非推奨)
  • AES

DESは古いやり方で現在は非推奨だそうです。今回はAESで暗号化します。

2.鍵長

AESにもいくつかのバリエーションがあります。まず、鍵長によって違いが出てきます。
鍵とはパスワードのようなものですね。で、鍵長はその長さ(bit数)になります。長ければ長いほど安全ですが、その分計算量が多くなってしまいます。

鍵長はどんな長さでもよいわけではなく、次の3つから選ぶことになります。

  • 128bit(AES-128)
  • 192bit(AES-192)
  • 256bit(AES-256)

3.暗号利用モード

AESは入力の文字列などを一定の長さに区切ったブロックごとに処理します。その処理のやり方を暗号利用モードといいます。CBCが一般的で、ECBは非推奨だそうです。

  • ECB(非推奨)
  • CBC

4.初期化ベクトル

暗号利用モードのCBCでは、ブロックごとの処理において1つ前の処理結果を利用します。しかし、一番最初は前の結果がないため、このときに代用する値を初期化ベクトルといいます。

5.パディング

AESでは入力を一定の長さのブロックごとに処理していきます。すると、最後のブロックの長さに対して入力が足りなくなってしまうことがあります。この余った部分を埋める方法がパディングです。

  • PKCS7
  • PKCS5