Genere bytes aleatorios para la clave TripleDES C #
Pregunta
Necesito generar una matriz de bytes para el cifrado TripleDES.No quiero usar .generateKey()
porque necesito saber los bytes en la clave para pasarlos a otra aplicación.
Gracias por las respuestas, pero olvidé mencionar una cosa: los bytes deben tener una paridad impar.De lo contrario, no puedo generar una clave TripleDES a partir de ellos.No estoy tan familiarizado con la paridad impar, así que supongo que tengo que crear una verificación de bytes si tiene paridad impar o no;entonces, si lo pone en la matriz, de lo contrario no.
Solución
Si necesita garantizar la paridad impar, debe calcularla usted mismo.Esto debería hacer:
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;
Otros consejos
¿Qué tal:
RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] key = new byte[24]; // For a 192-bit key
rng.GetBytes(key);
tripleDes.Key = key;
Tenga en cuenta que RandomNumberGenerator
es adecuado paratrabajo criptográfico (en términos de datos aleatorios razonablemente seguros y difíciles de predecir), mientras que System.Random
no lo es.
Pero ... cuál es el problema con solo:
TripleDES provider = TripleDES.Create();
byte[] key = provider.Key;
Allí obtendrá su clave utilizada por el cifrador y descifrador creado con esta instancia.
Tenga en cuenta que las otras respuestas carecen de un TripleDES.IsWeakKey
.
El método GetBytes devuelveSecuencia de valores criptográficamente fuerte:
var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
byte [] barr = new byte[128];
rng.GetBytes(barr);
foreach (var b in barr)
{
Console.WriteLine(b);
}
¿Qué pasa con Random.NextBytes()
Más información aquí .