2010-02-04 47 views
6

我试图从我的SharePoint网站发送一些加密的数据到我公司的PeopleSoft网站。 PeopleSoft人坚持我必须使用OpenSSL库进行加密。我已经从SourceForge下载并安装了OpenSSL.Net项目。如何使用OpenSSL.Net C#包装器对AES字符串进行加密?

为了我的目的,我需要用AES加密一个字符串。我知道如何用System.Security.Cryptography库来做到这一点,但是我很难将它转换成OpenSSL.Net。非常令人沮丧,因为我可以在Intellisense中看到我认为需要的一切!

有没有人有使用OpenSSL.Net包装进行AES加密/ AES解密的例子?

谢谢!

- 尼克

回答

4

这是为我工作的样本。我通过使用复制粘贴来简化它,但不要紧。

由于与JS库的兼容性,我使用的是文本密码,但是开放式SSL本身支持byte [] Key和IV的直接使用,因此您可以使用它。

为了二进制数据转换成字符串只是用

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

来回转换。

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

这些都是一些非常随机的八个字节的盐) – Nate 2010-07-14 15:45:59

+0

好了,足够的随机回答的问题,因为这的确是一个不活代码:) – 2010-07-16 11:48:36

+0

我的实现是基于关闭这个例子的。我正在使用Cipher.AES_256_CBC上下文,但如果在调用cc.Crypt时密码<16字节,则会引发异常。因为它试图将16字节的加密数据写入它创建的8字节缓冲区。你有没有遇到过这个?我使用的是OpenSSL.Net 0.4.4,我正在使用SHA1消息摘要。 – Jeff 2010-10-25 21:29:07

相关问题