Генерация случайных байтов для ключа TripleDES C#
Мне нужно сгенерировать байтовый массив для шифрования TripleDES. Я не хочу использовать .generateKey()
потому что мне нужно знать байты в ключе, чтобы передать их в другое приложение.
Спасибо за ответы, но я забыл упомянуть одну вещь: байты должны быть нечетным соотношением. В противном случае я не могу сгенерировать ключ TripleDES из них. Я не очень знаком с нечетной четностью, поэтому я должен создать проверку байтов, имеет ли она нечетную четность или нет; тогда, если это действительно поместит это в массив, иначе нет.
5 ответов
Если вам нужно обеспечить нечетное соотношение, вы должны сами его вычислить. Это должно сделать:
var rng = new RNGCryptoServiceProvider();
var key = new byte[24];
rng.GetBytes(key);
for(var i = 0; i < key.Length; ++i)
{
int keyByte = key[i] & 0xFE;
var parity = 0;
for (var b = keyByte; b != 0; b >>= 1) parity ^= b & 1;
key[i] = (byte)(keyByte | (parity == 0 ? 1 : 0));
}
return key;
Как насчет:
RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] key = new byte[24]; // For a 192-bit key
rng.GetBytes(key);
tripleDes.Key = key;
Обратите внимание, что RandomNumberGenerator
подходит для криптографической работы (с точки зрения достаточно надежных, трудно предсказуемых случайных данных), тогда как System.Random
нет.
Но... в чем проблема только с:
TripleDES provider = TripleDES.Create();
byte[] key = provider.Key;
Там вы получите свой ключ, используемый эн- и дешифратором, созданным с этим экземпляром.
Обратите внимание, что другие ответы не имеют TripleDES.IsWeakKey
,
Метод GetBytes возвращает криптографически строгую последовательность значений:
var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
byte [] barr = new byte[128];
rng.GetBytes(barr);
foreach (var b in barr)
{
Console.WriteLine(b);
}