たるきちのあれこれ









  Topプログラミングサンプル ▶ 文字列をパスワードで暗号化・複号化

文字列をパスワードで暗号化・複号化するサンプルです。

C#

// using System.Security.Cryptography;

// パスワードから共有キーと初期化ベクタを作成

private static void GenerateKeyFromPassword(string password, int keySize, out byte[] key, int blockSize, out byte[] iv)
{
    byte[] salt = Encoding.UTF8.GetBytes("RandomByte");  // 8バイト以上の任意の文字列を指定
    Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(password, salt);
    rdb.IterationCount = 999;  // 演算反復処理回数
    key = rdb.GetBytes(keySize / 8);
    iv = rdb.GetBytes(blockSize / 8);
}

// 文字列を暗号化
private static string EncryptString(string sourceString, string password)
{
    RijndaelManaged rm = new RijndaelManaged();
    byte[] key, iv;
    GenerateKeyFromPassword(password, rm.KeySize, out key, rm.BlockSize, out iv);
    rm.Key = key;
    rm.IV = iv;

    byte[] strBytes = Encoding.UTF8.GetBytes(sourceString);
    string strRet;
    using (ICryptoTransform ict = rm.CreateEncryptor())
    {
        byte[] encBytes = ict.TransformFinalBlock(strBytes, 0, strBytes.Length);
        strRet = Convert.ToBase64String(encBytes);
    }
    return strRet;
}

// 暗号化された文字列を復号化
private static string DecryptString(string encryptString, string password)
{
    RijndaelManaged rm = new RijndaelManaged();
    byte[] key, iv;
    GenerateKeyFromPassword(password, rm.KeySize, out key, rm.BlockSize, out iv);
    rm.Key = key;
    rm.IV = iv;

    byte[] strBytes = Convert.FromBase64String(encryptString);
    string strRet;
    using (ICryptoTransform ict = rm.CreateDecryptor())
    {
        byte[] decBytes = ict.TransformFinalBlock(strBytes, 0, strBytes.Length);
        strRet = Encoding.UTF8.GetString(decBytes);
    }
    return strRet;
}