2010-02-04 7 views
6

Ich versuche, verschlüsselte Daten von meiner SharePoint-Website an die PeopleSoft-Website meines Unternehmens zu senden. Die Leute von PeopleSoft bestehen darauf, dass ich die OpenSSL-Bibliothek für meine Verschlüsselung verwenden muss. Ich habe das OpenSSL.Net-Projekt von SourceForge heruntergeladen und installiert.Wie verwende ich den OpenSSL.Net C# -Wrapper, um eine Zeichenfolge mit AES zu verschlüsseln?

Für meine Zwecke muss ich einfach eine Zeichenfolge mit AES verschlüsseln. Ich weiß, wie man das mit der System.Security.Cryptography-Bibliothek macht, aber es fällt mir sehr schwer, dies auf die OpenSSL.Net-Seite zu übersetzen. Sehr frustrierend, da ich in Intellisense alles sehen kann was ich denke ich brauche!

Hat jemand ein Beispiel für die Verschlüsselung/Entschlüsselung von Strings mit AES mit dem OpenSSL.Net-Wrapper?

Danke!

-Nick

Antwort

4

Hier ist die Probe, die für mich funktioniert. Ich habe es mit Copy-Paste vereinfacht, sollte aber keine Rolle spielen.

Ich benutze Text-Passwort aufgrund der Kompatibilität mit JS-Bibliothek, aber offene SSL selbst unterstützt die direkte Verwendung von byte [] Key und IV, so dass es an Ihnen liegt, was zu verwenden.

Um binäre Daten in die String umschalten nur

Encoding.UTF8.GetBytes() and Encoding.UTF8.GetString() 

hin und her zu überführen.

public Byte[] Encrypt(Byte[] data, String password) 
    { 
     //Just random 8 bytes for salt 
     var salt = new Byte[] {1, 2, 3, 4, 5, 6, 7, 8}; 

     using (var cc = new CipherContext(Cipher.AES_256_CBC)) 
     { 
      //Constructing key and init vector from string password 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
      byte[] iv; 
      byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv); 

      var memoryStream = new MemoryStream(); 

      //Performing encryption thru unmanaged wrapper 
      var aesData = cc.Crypt(data, key, iv, true); 

      //Append salt so final data will look Salted___SALT|RESTOFTHEDATA 
      memoryStream.Write(Encoding.UTF8.GetBytes("Salted__"), 0, 8); 
      memoryStream.Write(salt, 0, 8); 
      memoryStream.Write(aesData, 0, aesData.Length); 

      return memoryStream.ToArray(); 
     } 
    } 

    public Byte[] Decrypt(String password, Byte[] encryptedData) 
    { 
     byte[] salt = null; 
     //extracting salt if presented 
     if (encryptedData.Length > 16) 
     { 
      if (Encoding.UTF8.GetString(encryptedData).StartsWith("Salted__")) 
      { 
       salt = new Byte[8]; 
       Buffer.BlockCopy(encryptedData, 8, salt, 0, 8); 
      } 
     } 

     //Removing salt from the original array 
     int aesDataLength = encryptedData.Length - 16; 
     byte[] aesData = new byte[aesDataLength]; 
     Buffer.BlockCopy(encryptedData, 16, aesData, 0, aesDataLength); 


     using (var cc = new CipherContext(Cipher.AES_256_CBC)) 
     { 
      //Constructing key and init vector from string password and salt 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
      byte[] iv; 
      byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv); 

      //Decrypting 
      return cc.Decrypt(aesData, key, iv, 0); 

     } 


    } 
+1

Das sind einige sehr zufällig acht Bytes für das Salz;) – Nate

+0

Nun, genug zufällig die Frage zu beantworten, da dies in der Tat nicht ein Live-Code ist :) –

+0

ist meine Implementierung off dieses Beispiels basiert. Ich benutze den Cipher.AES_256_CBC-Kontext, aber wenn mein Passwort <16 Bytes ist, wenn cc.Crypt aufgerufen wird, löst es eine Ausnahme aus. Weil es versucht, die verschlüsselten Daten, die 16 Bytes sind, in den 8-Byte-Puffer zu schreiben, den es erzeugt. Bist du dem begegnet? Ich benutze OpenSSL.Net 0.4.4 und ich verwende einen SHA1 Message Digest. – Jeff

Verwandte Themen