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);
}
}
}