2014-10-01 211 views
1

我试图在.NET应用程序中利用OpenSSL中的PKCS5_PBKDF2_HMAC函数,如下所示使用DllImport属性。在.NET包装库OpenSSL.NET(http://openssl-net.sourceforge.net/)目前不公开此OpenSSL的功能,所以我试图以类似的方式这样做,但我与C使用OpenSSL的.NET中的PKCS5_PBKDF2_HMAC

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
public extern static int PKCS5_PBKDF2_HMAC(string pass, int passlen, byte[] salt, int saltlen, int iter, IntPtr digest, int keylen, out byte[] outBytes); 

这里我的经验不足导致失败从OpenSSL的源代码的函数签名:

int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, const unsigned char *salt, int saltlen, int iter, const EVP_MD *digest, int keylen, unsigned char *out) 

我试图把这个使用下面的方法,但显然有一些错误的,因为我一直得到“试图读取或写入保护内存”在电话会议PKCS5_PBKDF2_HMAC。

public byte[] DeriveKey(MessageDigest digest, string password, byte[] salt, int iterations) 
{      
    var keyBuffer = new byte[digest.Size]; 
    Native.ExpectSuccess(Native.PKCS5_PBKDF2_HMAC(password, password.Length, salt, salt.Length, iterations, digest.Handle, digest.Size, out keyBuffer)); 

    return keyBuffer; 
} 

如果其他人已经成功做到这一点,或者在我的尝试中看到错误,我将不胜感激任何建议。

回答

0

经过一些试验和错误,我发现我并不需要outBytes参数上的“out”前缀。正在为我工​​作的外部函数定义是:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
public extern static int PKCS5_PBKDF2_HMAC(string pass, int passlen, byte[] salt, int saltlen, int iter, IntPtr digest, int keylen, byte[] outBytes);