35 Stimmen

Wie erstellt man einen Verschlüsselungscode für Verschlüsselungsalgorithmen?

Ich möchte Verschlüsselungsalgorithmus im .Net Security-Namensraum verwenden, aber ich versuche zu verstehen, wie der Schlüssel zu generieren, zum Beispiel AES-Algorithmus braucht 256 Bits, dass 16 Byte Schlüssel, und einige Initialisierungsvektor, der auch einige Bytes ist.

  1. Kann ich jede beliebige Kombination von Werten in meinem Schlüssel und IV verwenden? z.B. sind alle Nullen in Schlüssel und IV gültig oder nicht? Ich kenne die Details von Algorithmen, die viele Xoren verwenden, so dass Nullen nichts nützen, aber gibt es bei diesen Algorithmen irgendwelche Einschränkungen?

  2. Oder muss ich den Schlüssel mit einem Programm generieren und ihn irgendwo dauerhaft speichern?

Ich möchte Daten in der Datenbank nach der Verschlüsselung speichern, die sicheren Profildaten wie Benutzername, Passwort, Telefonnummer usw., und der Schlüssel wird nur für den in der Verbindungszeichenfolge genannten Datenbankbenutzer und den Administrator verfügbar sein.

48voto

Sie sollten das wirklich auf die richtige Art und Weise tun :)

1) Verwenden Sie eine sicher generierte Zufalls-IV
2) Verwenden Sie einen sicher generierten Zufallsschlüssel
3) Verwenden Sie nicht den EZB-Modus - EVER

AesManaged aes = new AesManaged();
aes.GenerateKey();
aes.GenerateIV();

Der obige Code wird korrekt und sicher einen zufälligen IV und einen zufälligen Schlüssel für Sie generieren.

18voto

IbrarMumtaz Punkte 4026

Klingt so, als müssten Sie sich in die Klasse Rfc2898DeriveBytes einlesen.

Rfc2898DeriveBytes.GetBytes();

Es gibt eine Methode (siehe oben), mit der Sie die Größe von Byte-Arrays, die in die Eigenschaften .Key und .IV eines symmetrischen Verschlüsselungsalgorithmus eingegeben werden, einfach durch Eingabe eines int-Wertes anpassen können. Das offizielle MS 70-536 Buch schlägt vor, dies programmatisch zu tun, indem man die KeySize Eigenschaft / 8 teilt.

z.B. TripleDes oder AESManaged. Unabhängig davon, welchen Algorithmus Sie verwenden, hat der Algorithmus selbst einige Voraussetzungen, die zuerst erfüllt werden müssen. So müssen z. B. die Bedingungen für die Schlüsselgröße erfüllt werden. Die RunTime füllt automatisch die Eigenschaften und Felder aus und wählt die besten und stärksten Werte für Sie aus. Aber die IV und der Schlüssel müssen von Ihnen kommen. Auf diese Weise können Sie Folgendes tun:

RijndaelManaged myAlg = new RiRijndaelManaged();
byte[] salt = Encoding.ASCII.GetBytes("Some salt value");
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes("some password", salt);
myAlg.Key = key.GetBytes( myAlg.KeySize / 8);
myAlg.IV  = key.GetBytes( myAlg.BlockSize / 8);
// myAld should now fully set-up.

Oben können Sie sehen, was ich meine, wenn ich es pro-grammatisch mache, denn es sollte ziemlich genau alles für Sie erledigen, ohne dass Sie auch nur ein Auge zudrücken müssen, um die Voraussetzungen zu erfüllen.

Das Microsoft 70-536 Buch besagt, dass die .Key-Eigenschaften die von Ihnen angegebenen Byte-Arrays erwarten in Bytes und nicht in Bits. Die RFC-Klasse arbeitet in Bytes, während die KeySize-Eigenschaft eines Algorithmus in Bits arbeitet. 1 Byte = 8 Bits. Sie sehen, worauf das hinausläuft ... ? Dies sollte Ihnen eine Vorstellung davon geben, warum das obige Code-Beispiel so gemacht ist, wie es ist! Ich habe es studiert und es ergibt für mich verdammt viel Sinn!

Die obige Antwort sollte es Ihnen ermöglichen, Ihr Algorithmus-Objekt mit dem übergebenen Passwort und einem statischen Salt-Wert zu erstellen, der an beiden Enden hart kodiert werden kann. Das Einzige, was Sie tun müssen, ist, sich Gedanken darüber zu machen, wie Sie sicherstellen, dass die unter .Key und .IV gespeicherten Byte-Arrays sicher zu einem Empfänger transportiert werden, damit dieser die von Ihnen verschlüsselte Nachricht erfolgreich entschlüsseln kann. Durch sichere Rekonstruktion desselben Algorithmusobjekts.

OBTW:

AESManaged hat eine Schlüsselgröße req': 128Bits = 16 Bytes !!! (8*8 = 64, 64Bit / 8Bits pro Byte = 8 Bytes) Daher

64*2 = 128Bit, 8*2, ==> 16Byte Schlüsselgröße !

256Bit = 32Bytes !!!!


Laut dem offiziellen 70-536 Training Kit Book ist Aes auf eine Schlüsselgröße von 128 Bit beschränkt. 256 Bits, 192 und 128 Schlüsselgrößen können beispielsweise mit der Rijndael-Klasse verwendet werden.


Andererseits können Sie den ganzen Mist vergessen und stattdessen einfach die Methoden .GenerateKey und GenerateIV verwenden, um sich die Mühe zu ersparen, ein gemeinsam genutztes und vereinbartes Kennwort und statische Salt-Werte auszuwählen. Ihr einziges Problem besteht darin, einen Weg zu finden, die Schlüssel- und IV-Byte-Arrays zu speichern und abzurufen. Binäre Formatierer? .

14voto

Remus Rusanu Punkte 280155

Wenn Sie Daten verschlüsselt austauschen wollen, benötigen Sie ein Schlüsselaustauschprotokoll, das Sie aber nicht selbst erstellen, sondern ein Standardprotokoll wie TLS oder SSL verwenden.

Wenn Sie die Daten verschlüsselt speichern, generieren Sie den IV mit CryptGenRandom (oder sein .net-Äquivalent RandomNumberGenerator.GetBytes ) und speichern Sie es zusammen mit dem Dokument (im Klartext, die IV muss nicht geschützt werden). Sie schreiben den Schlüssel nie auf, der Schlüssel wird vom Benutzer bereitgestellt. Normalerweise leitet man den Schlüssel aus einer Passwortphrase ab, indem man CryptDeriveKey oder sein .Net-Äquivalent PasswordDeriveKey.CryptDeriveKey .

Update

Um ein Geheimnis in der Datenbank zu speichern, das nur für den Benutzer und einen Administrator zugänglich ist, müssen Sie 3 Schlüssel verwenden:

  • einen Schlüssel, mit dem die Daten verschlüsselt werden (DK-Schlüssel)
  • einen Benutzerschlüssel zur Verschlüsselung des DK-Schlüssels (nennen Sie ihn UK)
  • ein Administrator-Schlüssel zur Verschlüsselung des DK-Schlüssels (AK genannt)

Theoretisch verschlüsseln Sie die Daten mit DK und verschlüsseln dann die DK mit UK und speichern sie, und verschlüsseln die DK mit AK und speichern sie. Auf diese Weise kann der Benutzer wieder die UK verwenden, um die DK zu entschlüsseln und dann die Daten zu entschlüsseln, und der Administrator kann die AK verwenden, um die DK zu entschlüsseln und dann die Daten zu entschlüsseln. Das große Problem ist die Tatsache, dass das System immer automatisiert ist, so dass das System Zugriff auf den Schlüssel des Administrators benötigt, was bedeutet, dass es sich nicht wirklich um einen persönlichen Schlüssel des Administrators handelt, sondern um einen Systemschlüssel (er kann zum Beispiel nicht für Zwecke der Nichtabstreitbarkeit verwendet werden).

Als Vorwarnung, Wissen, was IV ist oder wie man AES von C# aus benutzt und wie Kryptographie-Algorithmen funktionieren, wird Ihnen genau 0 (null) Traktion bei der Lösung dieser Art von Problemen bringen. Das Problem ist nie, welche IV und welcher Schlüssel zu verwenden ist, das Problem ist immer die Schlüsselbereitstellung. Für tatsächliche Krypto-Operationen, verwenden Sie einfach die eingebaute Unterstützung der Datenbank, siehe Kryptographie in SQL Server . Ich kann leicht argumentieren, dass die sólo benötigen Sie die TDE ( Transparente Datenverschlüsselung ) zum Schutz vor versehentlichem Verlust von Medien.

13voto

Fitzchak Yitzchaki Punkte 8967

Generieren Sie einen zufälligen Buchstaben/Hex-Code in einer bestimmten Länge.

Diese Funktion (übernommen von ici ) geben einen zufälligen Schlüssel in einer bestimmten Länge zurück:

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

6voto

AxelEckenberger Punkte 16238

Verwenden Sie System.Security.Cryptography.RandomNumberGenerator um Zufallsbytes zu erzeugen:

var rnd = new System.Security.Cryptography.RandomNumberGenerator.Create();
var key = new byte[50];
rnd.GetBytes(key);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X