2010-02-04 7 views
6

J'essaie d'envoyer des données cryptées de mon site SharePoint vers le site PeopleSoft de mon entreprise. Les gens de PeopleSoft insistent sur le fait que je dois utiliser la bibliothèque OpenSSL pour mon chiffrement. J'ai téléchargé et installé le projet OpenSSL.Net à partir de SourceForge. Pour mes besoins, j'ai simplement besoin de crypter une chaîne avec AES. Je sais comment faire avec la bibliothèque System.Security.Cryptography, mais j'ai du mal à traduire cela du côté d'OpenSSL.Net. Très frustrant, puisque je peux voir tout ce dont je pense avoir besoin dans Intellisense!Comment utiliser le wrapper C# OpenSSL.Net pour chiffrer une chaîne avec AES?

Quelqu'un a-t-il un exemple d'exécution de cryptage/décryptage de chaîne avec AES en utilisant l'encapsuleur OpenSSL.Net?

Merci!

-Nick

Répondre

4

Voici l'échantillon qui fonctionne pour moi. Je l'ai simplifié en utilisant copier-coller mais ne devrait pas importer. J'utilise le mot de passe de texte en raison de la compatibilité avec la bibliothèque JS, mais SSL ouvert lui-même prend en charge l'utilisation directe de byte [] Key et IV donc c'est à vous de décider quoi utiliser.

Pour passer des données binaires dans la chaîne utilisent juste

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

pour convertir en arrière.

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

Ce sont là quelques huit octets très aléatoire pour le sel;) – Nate

+0

Eh bien, assez aléatoire pour répondre à la question, car cela est en effet pas un code en direct :) –

+0

Ma mise en œuvre est basé sur cet exemple. J'utilise le contexte Cipher.AES_256_CBC mais si mon mot de passe est <16 octets lorsque cc.Crypt est appelé, il déclenche une exception. Parce qu'il essaie d'écrire les données cryptées de 16 octets dans le tampon de 8 octets qu'il crée. Avez-vous rencontré cela? J'utilise OpenSSL.Net 0.4.4 et j'utilise un résumé de message SHA1. – Jeff