我试图通过利用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;
}
如果其他人成功完成此操作,或者在我的尝试中发现错误,我将不胜感激任何建议。
答案 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);