2010-02-04 28 views
6

Tôi đang cố gắng gửi một số dữ liệu được mã hóa từ trang SharePoint của tôi đến trang PeopleSoft của công ty tôi. PeopleSoft folks nhấn mạnh rằng tôi phải sử dụng thư viện OpenSSL để mã hóa của tôi. Tôi đã tải xuống và cài đặt dự án OpenSSL.Net từ SourceForge.Làm cách nào để sử dụng trình bao bọc OpenSSL.Net C# để mã hóa chuỗi bằng AES?

Vì mục đích của mình, tôi cần phải mã hóa đơn giản một chuỗi bằng AES. Tôi biết làm thế nào để làm điều này với thư viện System.Security.Cryptography, nhưng có một thời gian rất khó dịch này sang bên OpenSSL.Net. Rất bực bội, vì tôi có thể thấy mọi thứ tôi nghĩ mình cần trong Intellisense!

Có ai có ví dụ về thực hiện mã hóa chuỗi/giải mã với AES bằng cách sử dụng trình bao bọc OpenSSL.Net không?

Cảm ơn!

-Nick

Trả lời

4

Đây là mẫu phù hợp với tôi. Tôi đã đơn giản hóa nó bằng cách sử dụng copy-paste nhưng không quan trọng.

Tôi đang sử dụng mật khẩu văn bản do khả năng tương thích với thư viện JS nhưng SSL tự mở hỗ trợ việc sử dụng trực tiếp byte [] Key và IV do đó tùy thuộc vào bạn nên sử dụng gì.

Để chuyển dữ liệu nhị phân vào chuỗi chỉ cần sử dụng

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

để chuyển đổi qua lại.

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

Đó là một số rất ngẫu nhiên Tám byte cho muối;) – Nate

+0

Vâng, đủ ngẫu nhiên để trả lời câu hỏi như thế này thực sự là không một mã live :) –

+0

thực hiện của tôi là dựa tắt của ví dụ này. Tôi đang sử dụng bối cảnh Cipher.AES_256_CBC nhưng nếu mật khẩu của tôi là <16 byte khi cc.Crypt được gọi là nó ném một ngoại lệ. Bởi vì nó đang cố gắng ghi dữ liệu được mã hóa là 16 byte vào bộ đệm 8 byte mà nó tạo ra. Bạn đã gặp phải điều này? Tôi đang sử dụng OpenSSL.Net 0.4.4 và tôi đang sử dụng thông báo SHA1. – Jeff

Các vấn đề liên quan