Generieren Sie zufällige Bytes für den TripleDES-Schlüssel C #
Frage
Ich muss ein Byte-Array für die TripleDES-Verschlüsselung generieren.Ich möchte keinen .generateKey()
verwenden, da ich die Bytes im Schlüssel kennen muss, um sie an eine andere Anwendung zu übergeben.
Danke für die Antworten, aber ich habe vergessen, eines zu erwähnen: Die Bytes müssen eine ungerade Parität sein.Andernfalls kann ich keinen TripleDES-Schlüssel daraus generieren.Ich bin mit der ungeraden Parität nicht so vertraut, daher muss ich wohl eine Byteprüfung erstellen, ob sie eine ungerade Parität hat oder nicht.dann, wenn es es in das Array setzt, sonst nicht.
Lösung
Wenn Sie die ungerade Parität sicherstellen müssen, müssen Sie sie selbst berechnen.Dies sollte Folgendes tun:
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;
Andere Tipps
Wie wäre es mit:
RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] key = new byte[24]; // For a 192-bit key
rng.GetBytes(key);
tripleDes.Key = key;
Beachten Sie, dass RandomNumberGenerator
für geeignet istKrypto-Arbeit (in Bezug auf einigermaßen sichere, schwer vorhersehbare Zufallsdaten), System.Random
hingegen nicht.
Aber ... was ist das Problem mit nur:
TripleDES provider = TripleDES.Create();
byte[] key = provider.Key;
Dort wird Ihr Schlüssel von dem mit dieser Instanz erstellten En- und Entschlüsseler verwendet.
Beachten Sie, dass den anderen Antworten ein TripleDES.IsWeakKey
fehlt.
Die GetBytes -Methode wird zurückgegebenkrypthographisch starke Folge von Werten:
var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
byte [] barr = new byte[128];
rng.GetBytes(barr);
foreach (var b in barr)
{
Console.WriteLine(b);
}
Was ist mit Random.NextBytes()
?
Weitere Informationen hier .