2010-11-29 4 views
0

hallo im String-Wert zu verschlüsseln und zu entschlüsseln versucht ... ich es gemacht durch Hand-Taste wie ...wie der gleichen Schlüssel zu erzeugen, wenn Krypto mit C# 4.0

private static byte[] _salt = Encoding.ASCII.GetBytes("123456789abcdefg"); 

und i erstellten Schlüssel und iv wie

Rfc2898DeriveBytes rfcDeriveBytes = new Rfc2898DeriveBytes(password, _salt); 
rijndaelManaged = new RijndaelManaged(); 
rijndaelManaged.Key = rfcDeriveBytes.GetBytes(rijndaelManaged.KeySize/8); 
rijndaelManaged.IV = rfcDeriveBytes.GetBytes(rijndaelManaged.BlockSize/8); 

aber ich möchte dynamisch den gleichen Schlüssel erzeugen ... ich meine, wie ich dynamisch generieren _salt kann ...

+0

Es ist nicht klar, was du mit „erstellen die gleichen Schlüssel dynamisch“ bedeuten. Was möchtest du dynamisch sein? Sprechen Sie nur über die Generierung eines * zufälligen * Schlüssels? Beachten Sie, dass Sie uns nichts über 'rfcDeriveBytes' gesagt haben. –

+0

Bitte erklären Sie, was Sie mit 'same' und 'dynamisch' hier –

+0

ich möchte Schlüssel Generator anstelle von _salt –

Antwort

1

Das ‚Salz‘ ist nicht geheim, können Sie es mit den verschlüsselten Daten enthalten . Sie können beim Verschlüsseln/Entschlüsseln keine verschiedenen Salze verwenden. Um effektiv zu sein, sollten Sie für jede Nachricht ein anderes Salz verwenden.

Sie können die Klasse System.Security.Cryptography.RandomNumberGenerator verwenden, um ein Salz zu erstellen.

+0

dank Ihnen für die Antwort –

+0

Hinweis, dass 'Rfc2898DeriveBytes' kann ein Salz für Sie erzeugen (mit' RandomNumberGenerator' intern) wenn du es fragst. – LukeH

2

Die Rfc2898DeriveBytes Klasse kann ein zufälliges Salz für Sie erzeugen - nur pass the required salt size to the appropriate constructor. Und vergessen Sie nicht, das generierte Salz irgendwo sicher zu speichern - es kann nicht deterministisch regeneriert werden, und ohne es werden Sie nicht in der Lage sein, Ihren Schlüssel und IV für die Entschlüsselung neu zu erstellen.

string password = GetPasswordFromUserInputOrWherever(); 

using (var deriveBytes = new Rfc2898DeriveBytes(password, 16)) // 16 byte salt 
{ 
    byte[] salt = deriveBytes.Salt; 

    // now save the salt somewhere safe 
    // you'll need it to generate the same byte sequence when decrypting 

    using (var rijndael = new RijndaelManaged()) 
    { 
     rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize/8); 
     rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize/8); 

     // encrypt... 
    } 
} 

Und dann zu entschlüsseln:

string password = GetPasswordFromUserInputOrWherever(); 
byte[] salt = GetSaltFromWhereverYouPreviouslySavedIt(); 

using (var deriveBytes = new Rfc2898DeriveBytes(password, salt)) 
using (var rijndael = new RijndaelManaged()) 
{ 
    rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize/8); 
    rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize/8); 

    // decrypt... 
} 
Verwandte Themen