休日更新の備忘録

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

【C#】文字列を復号する

【はじめに】

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

【手順】

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

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

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

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

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

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

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

namespace Decrypt
{
    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[] args)
        {
            string s_Encrypted = string.Empty;
            string s_PlainText = string.Empty;

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

            // 復号
            s_PlainText = DecryptText(s_Encrypted, s_Key, s_IV);

            // 平文の表示
            Console.WriteLine("平文:");
            Console.WriteLine(s_PlainText);
            Console.ReadLine();

        }

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

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

            // 暗号文をバイナリ型に変換する
            b_Encrypted = Convert.FromBase64String(s_Encrypted);

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

                ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                using (MemoryStream ms_Decrypt = new MemoryStream(b_Encrypted))
                {
                    using (CryptoStream cs_Decrypt = new CryptoStream(ms_Decrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader sr_Decrypt = new StreamReader(cs_Decrypt))
                        {
                            s_PlainText = sr_Decrypt.ReadLine();
                        }
                    }
                }
            }
            return s_PlainText;
        }
    }
}

手順3 実行する。

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

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

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

f:id:holidaynote:20190209170327p:plain

【注意】

 注意①

 本記事は前回の記事の続きです。
 ソースコード上の暗号化キーや暗号化ベクトルは、暗号化時に使用したものと同一でなければ復号はできません。

 ↓ 前回の記事 ↓
www.holiday-note.tech

-- 以上 --

参考ページ

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