2009年1月25日日曜日

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

標準的な暗号化方式の1つに公開鍵暗号があります。
コードはこんなかんじ。このサンプルでは、動的に公開鍵と秘密鍵を生成しています。

(ボタン押下の処理です。txtOriginalとtxtHashはTextBox。共通処理は3DESと同じ)
//公開鍵をXML形式で取得
private string publicKey = string.Empty;
//秘密鍵をXML形式で取得
private string privateKey = string.Empty;

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

    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {

        //公開鍵・秘密鍵をこのタイミングで生成する
        publicKey = rsa.ToXmlString(false);
        privateKey = rsa.ToXmlString(true);

        //公開鍵を指定
        rsa.FromXmlString(publicKey);

        //バイト列を暗号化
        byte[] encData = rsa.Encrypt(datatrue);
        //16進数文字列に変換
        txtHash.Text = byte2HexString(encData);
    }
}

/// <summary>
/// RSAで複合化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRSAD_Click(object senderEventArgs e)
{
    byte[] data = hexString2Byte(txtHash.Text);
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {

        //秘密鍵を指定
        rsa.FromXmlString(privateKey);

        //バイト列を複合化
        byte[] decData = rsa.Decrypt(datatrue);
        // 複合化されたデータを取得
        string code = Encoding.UTF8.GetString(decData);
        txtRestre.Text = code;
    }
}

1 件のコメント:

師子乃 さんのコメント...

こんばんは。

実際に自分で作ってみるのも面白いですね!