休日更新の備忘録

休日のみ更新予定の個人的備忘録置き場

【C#】文字列を暗号化する

【はじめに】

ここでは、 VisualStudioを使用したC#で暗号化のコンソールアプリケーションの作り方を紹介する。
なお、本記事の対象フレームワークは .NetFramework 4.5 を利用する。

【手順】

手順1 コンソールアプリケーション用のプロジェクトを作成する。

① VisualStudioを起動し、[ファイル]タブ→[新しいプロジェクト]から「新しいプロジェクト」画面を開く。

② 左ペインの[テンプレート]から[C#]を選択し、「コンソールアプリケーション」を選択する。

③ 画面下部の[名前]および[場所]に任意の値(ここでは「Encrypt」とする)を入力し[OK]ボタンをクリックする。

手順2 ソースコードを記述する。

① 「Program.cs」ファイルの内容を以下に変更する(コピペ可)。

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

namespace Encrypt
{
    class Program
    {
        /// <summary>
        /// 暗号化キー
        /// </summary>
        private const string s_Key = "abcdefghijklmnop";

        /// <summary>
        /// 暗号化ベクトル
        /// </summary>
        private const string s_IV = "1234567890123456";

        /// <summary>
        /// 文字コード(SJIS)
        /// </summary>
        private const string CHAR_CODE_SJIS = "shift_jis";

        /// <summary>
        /// メイン処理
        /// </summary>
        static void Main()
        {
            string s_PlainText = string.Empty;
            string s_Encrypted = string.Empty;

            // 暗号化する文字列(平文)を入力してもらう
            Console.WriteLine("平文を入力してください。:");
            s_PlainText = Console.ReadLine();

            // 暗号化
            s_Encrypted = EncryptText(s_PlainText, s_Key, s_IV);

            // 暗号文の表示
            Console.WriteLine("暗号文:");
            Console.WriteLine(s_Encrypted);
            Console.ReadLine();
        }

        /// <summary>
        /// 暗号化処理
        /// </summary>
        /// <param name="s_PlainText">平文</param>
        /// <param name="s_Key">暗号化キー</param>
        /// <param name="s_IV">暗号化ベクトル</param>
        /// <returns>暗号文</returns>
        private static string EncryptText(string s_PlainText, string s_Key, string s_IV)
        {
            byte[] b_Encrypted = null;
            string s_Encrypted = string.Empty;

            // キー、ベクターをバイナリ型に変換する
            byte[] b_Key = Encoding.GetEncoding(CHAR_CODE_SJIS).GetBytes(s_Key);
            byte[] b_IV = Encoding.GetEncoding(CHAR_CODE_SJIS).GetBytes(s_IV);

            using (RijndaelManaged rijAlg = new RijndaelManaged())
            {
                // ブロックサイズ、キーサイズを設定
                rijAlg.BlockSize = 128;
                rijAlg.KeySize = 128;

                rijAlg.Key = b_Key;
                rijAlg.IV = b_IV;

                ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

                using (MemoryStream ms_Encrypt = new MemoryStream())
                {
                    using (CryptoStream cs_Encrypt = new CryptoStream(ms_Encrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter sw_Encrypt = new StreamWriter(cs_Encrypt))
                        {
                            sw_Encrypt.Write(s_PlainText);
                        }

                        b_Encrypted = ms_Encrypt.ToArray();
                    }
                }
            }

            // バイナリ型から文字列型に変換する
            s_Encrypted = Convert.ToBase64String(b_Encrypted);

            return s_Encrypted;
        }
    }
}

手順3 実行する。

① [デバック]タブ→[デバッグ開始](またはF5キー)でデバッグを開始する。

② コマンドウィンドウに暗号化したい文字列(平文)を入力する。
 ※ 以下の画像ではサンプルとして「EncryptTest」を入力。

③ [Enter]キーを押下すると、暗号化した文字列が表示される。

f:id:holidaynote:20190206200608p:plain

【おまけ】

おまけ① 文字列⇔バイナリ変換について

 暗号文のバイナリ→文字列変換は「System.Convert.ToBase64String(str)」で変換しないとエラーになります。
 (最初は「System.Text.Encoding」を利用していましたがエラーで詰まりました。)

おまけ② 復号について

 こちらは次回の記事にまとめます。
 ↓ 復号の記事を投稿しました。 ↓

www.holiday-note.tech

 当たり前ですが、暗号化キーと初期ベクトルは暗号化と同じものを使用しないと、思い通りに復号できません。

-- 以上 --

参考ページ

RijndaelManaged Class (System.Security.Cryptography) | Microsoft Docs
プログラマの暗号化入門 - Qiita