MRが楽しい

MRやVRについて学習したことを書き残す

暗号化サービスプロバイダーを利用して厳密な乱数を生成する

本日は C# の小ネタ枠です。
暗号化サービスプロバイダーを利用して厳密な乱数を生成する方法を記事にします。

乱数の生成

C#で乱数を生成するには通常 Random クラスを利用します。
Random クラスによる乱数生成は速度は速いものの、予測が比較的容易という欠点があります。
learn.microsoft.com

ランダムなパスワードの作成時などより予測が難しい乱数を生成する必要がある場合は RNGCryptoServiceProvider クラスを利用します。
本クラスは暗号化サービスプロバイダーによる暗号乱数ジェネレーターです。Random クラスと比較して速度は遅くなります。
learn.microsoft.com

サンプルスクリプト

以下は RNGCryptoServiceProvider クラスを使って、指定の文字で構成されたパスワード文字列を生成するサンプルスクリプトです。
・PasswordGenerator.cs

using System;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class PasswordGenerator : MonoBehaviour
{
    [ContextMenu("Generate")]
    public void Generate()
    {
        // パスワードで使用する文字とパスワードの長さ
        string passwordCharacter = "abcdefghijklmnopqrstuvwxyz1234567890";
        int passwordLength = 8;

        // RNGCryptoServiceProvider クラスを使って乱数を生成
        byte[] seedByte = new byte[sizeof(int)];
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(seedByte);
        }

        // 乱数を Random クラスのシード値に利用する
        var seed = BitConverter.ToInt32(seedByte, 0);
        var random = new System.Random(seed);

        // ランダムなパスワードを生成
        StringBuilder res = new StringBuilder();
        while (passwordLength-- > 0)
        {
            res.Append(passwordCharacter[random.Next(passwordCharacter.Length)]);
        }

        Debug.Log($"Generated : {res.ToString()}");
    }
}