2013-10-18 25 views
5

Ich brauche derzeit eine Möglichkeit zum Verschlüsseln einer Zeichenfolge und Entschlüsseln eines Byte-Arrays mit AES-128 symmetrische Verschlüsselung in C#. Ich finde keinen Weg, wie ich das machen könnte, aber vielleicht habe ich etwas verpasst.Wie kann ich AES 128 ohne IV verschlüsseln und entschlüsseln?

+2

Warum wollen Sie IVs vermeiden? Sie sind ein wichtiges Sicherheitsmerkmal. – CodesInChaos

+0

Um @CodesInChaos Kommentar zu erweitern. IVs können zufällig erzeugt und im Klartext zusammen mit dem Chiffretext übertragen werden. Die Geheimhaltung der IV ist für die Sicherheit nicht notwendig. Die Voraussetzungen für eine IV sind, dass Sie nicht die gleiche Kombination aus Schlüssel und IV wiederverwenden und dass die IV schwer vorhersehbar ist. – Dev

+0

Diese Frage war für ein Projekt, bei dem jemand daran interessiert war, AES ohne IV zu verschlüsseln. Ich stimme zu, dass sie jedoch ein wichtiges Sicherheitsmerkmal sind! – kdh

Antwort

11

Import Namespaces

using System; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography; 

    static void Main(string[] args) 
     { 
      string value = "@arifansari300<3>"; 

      string encryptedValue= EncryptDecrypt.Encrypt(value); 

      string decryptedValue = EncryptDecrypt.Decrypt(encryptedValue); 
     } 

    public static string Encrypt(string clearText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(clearBytes, 0, clearBytes.Length); 
        cs.Close(); 
       } 
       clearText = Convert.ToBase64String(ms.ToArray()); 
      } 
     } 
     return clearText; 
    } 

    public static string Decrypt(string cipherText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] cipherBytes = Convert.FromBase64String(cipherText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(cipherBytes, 0, cipherBytes.Length); 
        cs.Close(); 
       } 
       cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
      } 
     } 
     return cipherText; 
    } 
+1

'Rfc2898DeriveBytes' ist nur eine gute Wahl, wenn Sie Kennwörter verwenden müssen, die vom Endbenutzer eingegeben werden, anstatt einen richtigen Schlüssel zu generieren. Aber in diesem Fall sollten Sie ein Salz verwenden (in Ihrem Beispiel ist es eine Konstante, die den Punkt von IVs verfehlt) und mehr Iterationen (mindestens 20k, vorzugsweise mehr). Wenn Sie einen richtigen Schlüssel haben, ist die normale Verschlüsselung einfacher und viel schneller. – CodesInChaos

+0

Wie kann ich diese Funktion PHP konvertieren? – user3581428

+0

@CodesInChaos Was meinst du mit "normale Verschlüsselung"? –