簡単な暗号化と復号化 (C#版)

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

0.始めに

 この文章は、「簡単な暗号化と復号化 (VB.NET版)」のソースコードをC#にしたものです。 解説等はVB.NET版をご覧下さい。

1.DES(Data Encryption Standard)による簡単な暗号化・復号化

[ソースコード]
using System;
using System.IO;
using System.Text;
using System.Security;
using System.Security.Cryptography;

namespace EncryptAndDecrypt
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            // 鍵は64ビット(8バイト)である必要がある
            byte[] key = Encoding.ASCII.GetBytes( "password" );

            // 暗号化して保存
            EncryptByDES( @"E:\Text.txt", @"E:\Encrypted.txt", key );

            // 復号化して保存
            DecryptByDES( @"E:\Encrypted.txt", @"E:\Decrypted.txt", key );
        }

        // DES(Data Encryption Standard)によって暗号化する
        static void EncryptByDES( string inputFileName, string encryptedFileName, byte[] encryptionKey )
        {
            FileStream inputStream;
            FileStream encryptedStream;

            // 暗号化する対象のFileStreamオブジェクト
            inputStream = new FileStream( inputFileName, FileMode.Open, FileAccess.Read );

            // 暗号化したものを書き込むためのFileStreamオブジェクト
            encryptedStream = new FileStream( encryptedFileName, FileMode.Create, FileAccess.Write );

            // DESと呼ばれる方法で暗号化するためのオブジェクト
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            // 鍵は64ビット(8バイト)のバイト配列である必要がある
            des.Key = encryptionKey;

            // 初期化ベクタ(暗号化と復号化の際には同じIVを必要とする)
            des.IV = encryptionKey;

            // CryptoStreamオブジェクトを作成する
            ICryptoTransform transform = des.CreateEncryptor(); // Encryptorを作成する
            CryptoStream cryptoStream = new CryptoStream( encryptedStream, transform, CryptoStreamMode.Write);

            // 暗号化する対象をバイト配列として読み込む
            int length = (int)inputStream.Length;
            byte[] buffer = new byte[length];

            inputStream.Read( buffer, 0, length );

            // CryptoStreamによって暗号化して書き込む
            cryptoStream.Write( buffer, 0, length );

            // CryptoStreamを閉じる
            cryptoStream.Close();

            // FileStreamを閉じる
            inputStream.Close();
            encryptedStream.Close();
        }

        // DES(Data Encryption Standard)暗号を復号化する
        static void DecryptByDES( string inputFileName, string decryptedFileName, byte[] decryptionKey )
        {
            FileStream inputStream;
            StreamWriter decryptedStream;

            // 復号化する対象のFileStreamオブジェクト
            inputStream = new FileStream( inputFileName, FileMode.Open, FileAccess.Read );

            // 復号化したものを書き込むためのStreamWriterオブジェクト
            decryptedStream = new StreamWriter( decryptedFileName, false, Encoding.UTF8 );

            // DESと呼ばれる方法で暗号化するためのオブジェクト
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            // 鍵は64ビット(8バイト)のバイト配列である必要がある
            des.Key = decryptionKey;

            // 初期化ベクタ(暗号化と復号化の際には同じIVを必要とする)
            des.IV = decryptionKey;

            // CryptoStreamオブジェクトを作成する
            ICryptoTransform transform = des.CreateDecryptor(); // Decryptorを作成する
            CryptoStream cryptoStream = new CryptoStream( inputStream, transform, CryptoStreamMode.Read);

            // CryptoStreamから読み込むためのStreamReaderを作成する
            StreamReader reader = new StreamReader( cryptoStream);

            // 復号化して書き込む
            decryptedStream.Write( reader.ReadToEnd());

            // ストリームを閉じる
            reader.Close();
            cryptoStream.Close();

            decryptedStream.Close();
        }
    }
}

2.DES(Data Encryption Standard)による簡単な暗号化・復号化

[ソースコード]
using System;
using System.IO;
using System.Text;
using System.Security;
using System.Security.Cryptography;

namespace EncryptAndDecrypt
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // 鍵は任意のビット数で可
            byte[] key = Encoding.ASCII.GetBytes( "longlongpassword" );

            // 初期化ベクタは8バイト
            byte[] iv = Encoding.ASCII.GetBytes( "password" );

            // 暗号化して保存
            EncryptByRC2( @"E:\Text.txt", @"E:\Encrypted.txt", key, iv );

            // 復号化して保存
            DecryptByRC2( @"E:\Encrypted.txt", @"E:\Decrypted.txt", key, iv );
        }

        // RC2アルゴリズムによって暗号化する
        static void EncryptByRC2( string inputFileName, string encryptedFileName, byte[] encryptionKey, byte[] iv )
        {
            FileStream inputStream;
            FileStream encryptedStream;

            // 暗号化する対象のFileStreamオブジェクト
            inputStream = new FileStream( inputFileName, FileMode.Open, FileAccess.Read );

            // 暗号化したものを書き込むためのFileStreamオブジェクト
            encryptedStream = new FileStream( encryptedFileName, FileMode.Create, FileAccess.Write );

            // DESと呼ばれる方法で暗号化するためのオブジェクト
            RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();

            // 鍵は任意のビット数で可
            rc2.Key = encryptionKey;

            // 初期化ベクタ(暗号化と復号化の際には同じIVを必要とする)
            rc2.IV = iv;

            // CryptoStreamオブジェクトを作成する
            ICryptoTransform transform = rc2.CreateEncryptor(); // Encryptorを作成する
            CryptoStream cryptoStream = new CryptoStream( encryptedStream, transform, CryptoStreamMode.Write);

            // 暗号化する対象をバイト配列として読み込む
            int length = (int)inputStream.Length;
            byte[] buffer = new byte[length];

            inputStream.Read( buffer, 0, length );

            // CryptoStreamによって暗号化して書き込む
            cryptoStream.Write( buffer, 0, length );

            // CryptoStreamを閉じる
            cryptoStream.Close();

            // FileStreamを閉じる
            inputStream.Close();
            encryptedStream.Close();
        }

        // RC2アルゴリズムで暗号化されたものを復号化する
        static void DecryptByRC2( string inputFileName, string decryptedFileName, byte[] decryptionKey, byte[] iv )
        {
            FileStream inputStream;
            StreamWriter decryptedStream;

            // 復号化する対象のFileStreamオブジェクト
            inputStream = new FileStream( inputFileName, FileMode.Open, FileAccess.Read );

            // 復号化したものを書き込むためのStreamWriterオブジェクト
            decryptedStream = new StreamWriter( decryptedFileName, false, Encoding.UTF8 );

            // DESと呼ばれる方法で暗号化するためのオブジェクト
            RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();

            // 鍵は任意のビット数で可
            rc2.Key = decryptionKey;

            // 初期化ベクタ(暗号化と復号化の際には同じIVを必要とする)
            rc2.IV = iv;

            // CryptoStreamオブジェクトを作成する
            ICryptoTransform transform = rc2.CreateDecryptor(); // Decryptorを作成する
            CryptoStream cryptoStream = new CryptoStream( inputStream, transform, CryptoStreamMode.Read);

            // CryptoStreamから読み込むためのStreamReaderを作成する
            StreamReader reader = new StreamReader( cryptoStream);

            // 復号化して書き込む
            decryptedStream.Write( reader.ReadToEnd());

            // ストリームを閉じる
            reader.Close();
            cryptoStream.Close();

            decryptedStream.Close();
        }
    }
}