2009年1月24日土曜日

[.NET]文字列の暗号化(AES)

.NET Frameworkではいくつか暗号化のアルゴリズムが提供されています。前回は3DES(トリプルDES)を利用した暗号化を実施しました。今回はAESというアルゴリズムを利用します。コードは3DESとほとんど同じですが、暗号化用のキー長が32bitになり、かつ3DESよりも高速に動作するようです。
3DES同様に暗号用のキー情報を保持する必要があり、その点が問題として残ります。コードはこんなかんじ。

(ボタン押下の処理です。txtOriginalとtxtHashはTextBox。共通処理は3DESと同じ)

//using System.Security.Cryptography;
//using System.IO;

string key = "0123456789ABCDEF0123456789ABCDEF";
string vec = "0123456789ABCDEF";

/// <summary>
/// AES暗号化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAESC_Click(object senderEventArgs e)
{
    //対象を16進バイト列化
    byte[] data = Encoding.UTF8.GetBytes(txtOriginal.Text);

    //暗号用のキー情報をセットする
    byte[] aesKey = Encoding.UTF8.GetBytes(key);
    byte[] aesIV = Encoding.UTF8.GetBytes(vec);

    //暗号化オブジェクトとストリームを作成する
    using (RijndaelManaged aes = new RijndaelManaged())
    using (MemoryStream ms = new MemoryStream())
    using (CryptoStream cs = new CryptoStream(msaes.CreateEncryptor(aesKeyaesIV),
                                       CryptoStreamMode.Write))
    {
        // ストリームに暗号化するデータを出力
        cs.Write(data0data.Length);
        cs.Close();

        // 暗号化されたデータを取得
        string code = byte2HexString(ms.ToArray());
        txtHash.Text = code;

        ms.Close();
    }
}

/// <summary>
/// AES複合化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAESD_Click(object senderEventArgs e)
{
    //対象を16進バイト列化
    byte[] data = hexString2Byte(txtHash.Text);

    //暗号用のキー情報をセットする
    byte[] aesKey = Encoding.UTF8.GetBytes(key);
    byte[] aesIV = Encoding.UTF8.GetBytes(vec);

    //暗号化オブジェクトとストリームを作成する
    using (RijndaelManaged aes = new RijndaelManaged())
    using (MemoryStream ms = new MemoryStream())
    using (CryptoStream cs = new CryptoStream(msaes.CreateDecryptor(aesKeyaesIV),
                                       CryptoStreamMode.Write))
    {
        // ストリームに複合化するデータを出力
        cs.Write(data0data.Length);
        cs.Close();

        // 複合化されたデータを取得
        string code = Encoding.UTF8.GetString(ms.ToArray());
        txtRestre.Text = code;

        ms.Close();
    }
}

0 件のコメント: