2011-03-18 15 views
8

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.Generar bytes aleatorios para la clave TripleDES C#

Gracias por las respuestas pero olvidé mencionar una cosa: los bytes tienen que ser paridad impar. De lo contrario, no puedo generar una clave TripleDES de ellos. No estoy tan familiarizado con la paridad impar, así que supongo que tengo que crear un control de bytes si tiene una paridad impar o no; luego si lo pone en la matriz, de lo contrario no.

Respuesta

4

Si necesita asegurar la paridad impar, usted tiene que calcular por sí 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; 
+0

Gracias, eso funcionó. – hs2d

-1

¿Qué hay de Random.NextBytes()

Más información here.

+0

'Random' no es seguro para uso criptográfico. – CodesInChaos

3

¿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 para el trabajo de cifrado (en términos de datos aleatorios razonablemente seguras, difíciles de predecir), mientras que System.Random no lo es.

+0

RandomNumberGenerator rng = new RandomNumberGenerator.Create(); – theIrishUser

1

El método devuelve GetBytes crypthographically fuerte secuencia de valores:

 var rng = System.Security.Cryptography.RandomNumberGenerator.Create(); 
     byte [] barr = new byte[128]; 
     rng.GetBytes(barr); 
     foreach (var b in barr) 
     { 
      Console.WriteLine(b); 
     } 
+0

Thnx, eso está funcionando, pero mira mi pregunta editada. Olvidé decir acerca de la extraña paridad. – hs2d

2

Pero ... ¿cuál es el problema con sólo:

TripleDES provider = TripleDES.Create(); 

byte[] key = provider.Key; 

Hay que obtenga su clave utilizada por el es- y descifrador creado con esta instancia.

Tenga en cuenta que las otras respuestas carecen de un TripleDES.IsWeakKey.

+0

Esto funciona de la mejor manera – atconway

Cuestiones relacionadas