使用OpenSSL的.NET中的PKCS5_PBKDF2_HMAC

时间:2014-10-01 22:10:03

标签: .net c openssl pbkdf2

我试图通过利用DllImport属性在.NET应用程序中利用OpenSSL中的PKCS5_PBKDF2_HMAC函数,如下所示。 .NET包装器库OpenSSL.NET(http://openssl-net.sourceforge.net/)目前没有公开这个OpenSSL功能,所以我试图以类似的方式这样做但由于我缺乏C经验而失败。

[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;
}

如果其他人成功完成此操作,或者在我的尝试中发现错误,我将不胜感激任何建议。

1 个答案:

答案 0 :(得分: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);