C# Language Données aléatoires sécurisées par cryptographie


Exemple

Il y a des moments où la classe Random () du framework peut ne pas être considérée comme suffisamment aléatoire, étant donné qu'elle est basée sur un générateur de nombres pseudo-aléatoires. Les classes Crypto du framework fournissent cependant quelque chose de plus robuste sous la forme de RNGCryptoServiceProvider.

Les exemples de code suivants montrent comment générer des tableaux, des chaînes et des nombres d'octets cryptographiquement sécurisés.

Tableau des octets aléatoires

public static byte[] GenerateRandomData(int length)
{
    var rnd = new byte[length];
    using (var rng = new RNGCryptoServiceProvider())
        rng.GetBytes(rnd);
    return rnd;
}

Nombre entier aléatoire (avec distribution uniforme)

public static int GenerateRandomInt(int minVal=0, int maxVal=100)
{
    var rnd = new byte[4];
    using (var rng = new RNGCryptoServiceProvider())
        rng.GetBytes(rnd);
    var i = Math.Abs(BitConverter.ToInt32(rnd, 0));
    return Convert.ToInt32(i % (maxVal - minVal + 1) + minVal);
}

Chaîne aléatoire

public static string GenerateRandomString(int length, string allowableChars=null)
{
    if (string.IsNullOrEmpty(allowableChars))
        allowableChars = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // Generate random data
    var rnd = new byte[length];
    using (var rng = new RNGCryptoServiceProvider())
        rng.GetBytes(rnd);

    // Generate the output string
    var allowable = allowableChars.ToCharArray();
    var l = allowable.Length;
    var chars = new char[length];
    for (var i = 0; i < length; i++)
        chars[i] = allowable[rnd[i] % l];

    return new string(chars);
}