2017-11-02 3 views
2

I einfache symmetrische verschlüsseln/Anwendung entschlüsseln, die gut funktioniert:Schlüsselerzeugung für symmetrischen Algorithmus

namespace Crypto 
{ 
    class Program 
    { 


     public static void EncryptSomeText() 
     { 
      string original ="My secretdata!"; 

      using (SymmetricAlgorithm symmetricAlgorithm = 
      new AesManaged()) 
      { 
       byte[] encrypted = Encrypt(symmetricAlgorithm, original); 
       string roundtrip = Decrypt(symmetricAlgorithm, encrypted); 

       // Displays: My secret data!  
       Console.WriteLine("Original:{ 0}", original); 
       Console.WriteLine("RoundTrip:{ 0}", roundtrip); 
      } 
     } 

     static byte[] Encrypt(SymmetricAlgorithm aesAlg, string plainText) 
     { 
      ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

      using (MemoryStream msEncrypt = new MemoryStream()) 
      { 
       using (CryptoStream csEncrypt = 
       new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
       { 
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
        { 
         swEncrypt.Write(plainText); 
        } 
        return msEncrypt.ToArray(); 
       } 
      } 
     } 

     static string Decrypt(SymmetricAlgorithm aesAlg, byte[] cipherText) 
     { 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
       using (CryptoStream csDecrypt = 
       new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 
         return srDecrypt.ReadToEnd(); 
        } 
       } 
      } 
     } 


     static void Main(string[] args) 
     { 
      SymmetricAlgorithm sma = SymmetricAlgorithm.Create(); 

      byte[] b = Encrypt(sma,"bla bla"); 
      string s= Decrypt(sma, b); 
      Console.WriteLine("Decrypted {0}", s); 


     } 
    } 
} 

Ich bin nur in Bezug auf die Schlüsselerstellung fragen. Bedeutet dies, dass es während der Erstellung eines symmetrischen Algorithmus automatisch erstellt wird? Wird es jedes Mal anders erzeugt? Ich nehme an, Benutzer sollten Schlüssel für diesen Zweck übergeben.

SymmetricAlgorithm sma = SymmetricAlgorithm.Create(); 

Antwort

1

Zufallsschlüssel generiert, wenn Sie Key Eigentum Ihrer SymmetricAlgorithm zugreifen, vorausgesetzt, Sie nicht vorher festgelegt haben, dass Key zu vordefinierten Schlüssel. Es wird nicht während des Baus von SymmetricAlgorithm selbst erzeugt.

var sma = SymmetricAlgorithm.Create(); 
// no key generated here yet 
var key = sma.Key; // generated key 
// accessing `Key` causes random key generation 


var sma = SymmetricAlgorithm.Create(); 
// no key here 
sma.Key = myKey; 
// you set the key, so no random key is generated 

Das gleiche gilt für IV (Nonce) Wert.

Generieren von zufälligen Schlüssel macht nur einmal Sinn, dann müssen Sie es zwischen verschlüsselnde/entschlüsselnde Partei in einer sicheren Weise teilen und es für zukünftige Verschlüsselungen/Entschlüsselungen verwenden. Während Sie dort sind, beachten Sie, dass IV Wert für jede Verschlüsselung zufällig sein sollte, so dass Sie normalerweise diesen IV-Wert dem verschlüsselten binären Array voranstellen und vor dem Entschlüsseln schneiden Sie diese IV vom Anfang des verschlüsselten Arrays und zur Entschlüsselung verwenden.