C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で暗号学的に安全な乱数を生成する方法:RNGCryptoServiceProviderクラスの使い方

暗号学的に安全な乱数を生成するには、RNGCryptoServiceProviderクラスを使用します。このクラスはSystem.Security.Cryptography名前空間に属しており、暗号処理に対応した乱数ジェネレーター(CSPRNG)を実装しています。

通常のRandomクラスとは異なり、予測が極めて困難な高品質な乱数を取得できるため、トークンやキーの生成など、セキュリティが求められる場面に適しています。

以下は、このクラスを使ってランダムな値を取得する基本的なコード例です。

using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider()) {
    byte[] val = new byte[6];
    crypto.GetBytes(val);
    randomvalue = BitConverter.ToInt32(val, 1);
}

crypto.GetBytesメソッドは、指定したバイト配列に暗号強度の高いランダムなバイト列を格納します。その後、BitConverter.ToInt32でバイト列から整数値へ変換しています。

安全な乱数を実際に生成して動作を確認したい場合は、次のサンプルコードを実行してみてください。この例では、生成した整数値から桁を取り出し、0〜1の範囲のdouble型の乱数に変換して出力しています。

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
public class Demo {
    public static void Main(string[] args) {
        for (int i = 0; i <= 5; i++) {
            Console.WriteLine(randomFunc());
        }
    }
    private static double randomFunc() {
        string n = "";
        int randomvalue;
        double n2;
        using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider()) {
            byte[] val = new byte[6];
            crypto.GetBytes(val);
            randomvalue = BitConverter.ToInt32(val, 1);
        }
        n += randomvalue.ToString().Substring(1, 1)[0];
        n += randomvalue.ToString().Substring(2, 1)[0];
        n += randomvalue.ToString().Substring(3, 1)[0];
        n += randomvalue.ToString().Substring(4, 1)[0];
        n += randomvalue.ToString().Substring(5, 1)[0];
        double.TryParse(n, out n2);
        n2 = n2 / 100000;
        return n2;
    }
}

出力結果

0.13559
0.0465
0.18058
0.26494
0.52231
0.78927

なお、RNGCryptoServiceProviderクラスは.NET 6以降では非推奨(Obsolete)となっています。最新の環境では、RandomNumberGenerator.Create()やRandomNumberGenerator.Fill()メソッドを使用することが推奨されています。基本的な仕組みは共通しているため、本記事のコードを理解すれば新しいAPIへの移行もスムーズに行えます。

  1. MySQLのストアドプロシージャで5つの乱数を生成する方法

    MySQLでランダムな数値を抽出するには、ORDER BY RAND() を活用するのが便利です。本記事では、テーブルに登録されたデータの中からランダムに5つの値を選び出し、それをストアドプロシージャとして作成・呼び出すまでの手順を、実際のコード例とともにわかりやすく解説します。 1. サンプルテーブルを作成する まず、乱数の候補となる値を格納するためのテーブルを作成します。 mysql> create table DemoTable (Value int); Query OK, 0 rows affected (0.76 sec) 2. テーブルにデータを挿入する 続いて、INSERT

  2. 【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法

    問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を