Question

I need to generate byte array for TripleDES encryption. I don't want to use .generateKey() because I need to know the bytes in the key to pass them to another application.

Thanks for the replies but I forgot to mention one thing: the bytes have to be odd parity. Otherwise I can't generate a TripleDES key from them. I'm not so familiar with the odd parity, so I guess have to create a byte check if it has odd parity or not; then if it does put it in the array, otherwise not.

Was it helpful?

Solution

If you need to ensure the odd parity, you have to compute it yourself. This should do:

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;

OTHER TIPS

How about:

RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] key = new byte[24]; // For a 192-bit key
rng.GetBytes(key);

tripleDes.Key = key;

Note that RandomNumberGenerator is suitable for crypto work (in terms of reasonably secure, hard-to-predict random data), whereas System.Random isn't.

But ... what's the problem with just:

TripleDES provider = TripleDES.Create();

byte[] key = provider.Key;

There you get your key used by the en- and decryptor created with this instance.

Note that the other answers lack a TripleDES.IsWeakKey.

The GetBytes method returns crypthographically strong sequence of values:

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

What about Random.NextBytes()

More info here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top