2009年1月27日火曜日

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

「暗号化する=暗号用キーが必要」というのがあり、システム構築の上で、この鍵をどこに保存するかという問題が発生します。コレを解決したのがDPAPI(データ保護 API)です。Windows 2000以降のOSで利用できるようです。

3DESやAESのように暗号用のキー情報を保持する必要はありませんが、故障などでマシンが死亡すると復旧できません。 コードはこんなかんじ。

(ボタン押下の処理です。txtHashはTextBox。共通処理は3DESと同じ)
/// <summary>
/// DPAPIで暗号化
/// </summary>
/// <remarks>system.security.dllが必要</remarks>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDPC_Click(object senderEventArgs e)
{
    //対象を16進バイト列化
    byte[] data = Encoding.UTF8.GetBytes(txtOriginal.Text);
    //バイト列を暗号化
    byte[] encData = ProtectedData.Protect(data
                                , entropy   //暗号用追加バイト列
                                , DataProtectionScope.LocalMachine);//暗号化スコープ(マシン範囲)
    //16進数文字列に変換
    txtHash.Text = byte2HexString(encData);

}

/// <summary>
/// DPAPI複合化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDPD_Click(object senderEventArgs e)
{
    //対象を16進バイト列化
    byte[] data = hexString2Byte(txtHash.Text);
    //バイト列を複合化
    byte[] decData = ProtectedData.Unprotect(data 
                                , entropy   //暗号用追加バイト列
                                , DataProtectionScope.LocalMachine);//暗号化スコープ(マシン範囲)
    // 複合化されたデータを取得
    string code = Encoding.UTF8.GetString(decData);
    txtRestre.Text = code;

}

0 件のコメント: