パスワード Triple DES

twitter client を作って遊んでいたら、パスワードを保存する必要があり、昔のメモ(2004年!) を引っ張り出して実装した。すげー、備忘録役になっているなぁ・・・=>自分。

パスワードを暗号化してレジストリに保存する

http://uchukamen.com/Programming/EncryptDecrypt/index.htm

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

namespace Security
{
    class Encription
    {
        /// PasswordEncoder はパスワードをTriple DESでエンコード、デコードします。

        /// keyStringから TripleDESCryptoServiceProvider のKey を生成します。
        /// 注意: この生成方法を変更するとデコードできなくなります。
        ///
        private static byte[] GenerateKey(string keyString, int len)
        {
            byte[] key = new byte[len];
            for (int i = 0; i < len; i++)
                key[i] = (byte)(keyString[i % keyString.Length] + i);
            return key;
        }

        /// keyStringから tripledescryptoserviceprovider のiv を生成します。
        /// 注意: この生成方法を変更するとデコードできなくなります。
        ///
        private static byte[] GenerateIV(string keyString, int len)
        {
            byte[] iv = new byte[len];
            for (int i = 0; i < len; i++)
                iv[i] = (byte)(keyString[i % keyString.Length] – i);

            return iv;
        }

        /// パスワード文字列 password をキー key でTriple DES暗号化を行います。
        ///
        public static byte[] Encrypt(string password, string key)
        {
            // Tripe DES のサービス プロバイダを生成します
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();

            tDes.Key = GenerateKey(key, tDes.Key.Length);
            tDes.IV = GenerateKey(key, tDes.IV.Length);

            // 文字列を byte 配列に変換します
            byte[] source = Encoding.Unicode.GetBytes(password);

            // 入出力用のストリームを生成します
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms,
                tDes.CreateEncryptor(tDes.Key, tDes.IV), CryptoStreamMode.Write);

            // ストリームに暗号化するデータを書き込みます
            cs.Write(source, 0, source.Length);
            cs.Close();

            // 暗号化されたデータを byte 配列で取得します
            byte[] destination = ms.ToArray();
            ms.Close();

            return destination;
        }

        /// パスワード文字列 password をキー key でtriple des復号化を行います。
        ///
        public static string Decrypt(byte[] source, string key)
        {
            // Tripe DES のサービス プロバイダを生成します
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();
            tDes.Key = GenerateKey(key, tDes.Key.Length);
            tDes.IV = GenerateKey(key, tDes.IV.Length);

            // 入出力用のストリームを生成します
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms,
                tDes.CreateDecryptor(tDes.Key, tDes.IV), CryptoStreamMode.Write);

            // ストリームに暗号化されたデータを書き込みます
            cs.Write(source, 0, source.Length);
            cs.Close();

            // 復号化されたデータを byte 配列で取得します
            byte[] destination = ms.ToArray();
            ms.Close();

            // byte 配列を文字列に変換して表示します
            return Encoding.Unicode.GetString(destination);
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です