[C#] RNGCryptoServiceProvider を利用してランダムな文字列を生成する方法


はじめに

暗号化/復号化や、計算など「乱数」を作成する機会は多々あるかと思います。

本稿では、RNGCryptoServiceProvider を利用してランダムな文字列を生成する方法を備忘録として残しておきます。

乱数の生成

まず、ランダムな文字列を作成する前に、乱数の生成についていくつかご紹介したいと思います

Randomクラスの利用

RandomクラスのNextメソッドを利用することで、指定した最小値から最大値までをランダムに生成します。

static void Main(){

    // Randomオブジェクトを生成
    System.Random rdm = new System.Random();

    int result = 0;

    // 0から10の数値をランダムに返す(10回繰り返し)
    for(i=0; i < 10; i++){
        Console.WriteLine(rdm.Next(0,10))
    }
}

RNGCryptoServiceProviderを利用して乱数生成

暗号化サービスプロバイダー(CSP)によるRNGCryptoServiceProviderを利用した乱数の生成方法です。

using (var rng = new RNGCryptoServiceProvider())
{
    var buffer = new byte[sizeof(int)];
    rng.GetBytes(buffer);
    int seed = BitConverter.ToInt32(buffer, 0);
}

ランダム文字列の作成

Membership.GeneratePasswordを利用する

パスワードなどを作成する際によく使うのが、MembershipクラスのGeneratePasswordメソッドです。

生成される文字列は、英数字(大文字/小文字含む)と、記号 !@#$%^&*()_-+=[{]};:<>|./? が含まれます。

string pass = System.Web.Security.Membership.GeneratePassword(8, 0);

第1引数は最大128まで指定可能であり、第2引数には、最低限含まれる区切り記号の数を指定します。(0を指定しても含まれる可能性があります)

GUIDを利用する

グローバル一意識別子 (GUID) を作成する方法もあります。

Guid g = System.Guid.NewGuid();
string pass = g.ToString("N").Substring(0, 8);

Guid 構造体 (System) | Microsoft Docs

RNGCryptoServiceProviderを利用する

string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder res = new StringBuilder();
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    byte[] uintBuffer = new byte[sizeof(uint)];

    while (length-- > 0)
    {
        rng.GetBytes(uintBuffer);
        uint num = BitConverter.ToUInt32(uintBuffer, 0);
        res.Append(valid[(int)(num % (uint)valid.Length)]);
    }
}

Console.WriteLine(res.ToString());

最後に

今回は、乱数の生成とランダム文字列の作成方法を備忘録として残しました。

パスワードの作成や、アクセスキーなどランダムな値を利用するケースは多々ありますので、ケースにあった方法を利用すると良いと思います。