Как создать случайную строку байтов в C#?

Сабж. Пытаюсь перевести код python в C#
Есть такой кусок кода

import base64
import hashlib
import secrets

random = base64.urlsafe_b64encode(secrets.token_bytes(32))

secrets.token_bytes(32) возвращает случайную строку байтов, содержащую количество байтов nbytes.

А base64.urlsafe_b64encode() принимает "байтоподобный объект".

Есть у меня такой C# код

public static byte[] GetByteArray()
{
    Random rnd = new Random();
    byte[] b = new byte[32]; 
    rnd.NextBytes(b);
    return b;
}

Но это массив байтов. окей. Делаю BitConverter.ToString(key) получаю строку вида 75-A7-A0-85-D3-05-8E-....... Но она не такая как в документации питона

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'

Что не так? Как мне получить такую же строку?

upd

Да, по коду питона мне дальше нужно

random = base64.urlsafe_b64encode(secrets.token_bytes(32)) 
m = hashlib.sha256() 
m.update(random) 
d = m.digest() 
code_challenge = base64.urlsafe_b64encode(d).decode().replace("=", "")


Но это я уже знаю как дальше. Но мне нужна строка байтов.
Просто с массивом байтов я уже пробовал делать и у меня не получается.
upd2
Я незнаю почему мне нужна строка вида \xebr\xe2\xebP1\x8b это мне нужно для OAuth 2.0, есть пример на python я пытаюсь его полностью повторить.
Потому что когда на C# я генерирую массив байтов потом его в Base64 потом его в mySHA256 потом его в Base64 как в инструкции <URL safe Base64(SHA256(URL safe Base64(random 32 byte string)))> у меня ничего не работает


Ответы (1 шт):

Автор решения: aepot

Для криптографии можно использовать криптостойкий PRNG RandomNumberGenerator.

Получится как-то так, если я верно понял код

private static string ToUrlSafeBase64(byte[] bytes, bool trimPadding = false)
{
    string result = Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('/', '_');
    return trimPadding ? result.TrimEnd('=') : result;
}
string base64key = ToUrlSafeBase64(RandomNumberGenerator.GetBytes(32));
byte[] bytes = Encoding.UTF8.GetBytes(base64key);
byte[] hash = SHA256.HashData(bytes);
string base64 = ToUrlSafeBase64(hash, true);
Console.WriteLine(base64);

Пример вывода в консоль

-XQ8VkSPUMFDW8m9d_xnzPYvFhrordTV-TUQConvVbE
→ Ссылка