使用OpenSSL';s PKCS5_PBKDF2_HMAC来自.NET
我试图在.NET应用程序中使用OpenSSL中的PKCS5_PBKDF2_HMAC函数,方法是使用DllImport属性,如下所示。.NET包装器库OpenSSL.NET()目前没有公开这个OpenSSL函数,因此我尝试以类似的方式公开它,但由于缺乏使用C语言的经验,我失败了使用OpenSSL';s PKCS5_PBKDF2_HMAC来自.NET,.net,c,openssl,pbkdf2,.net,C,Openssl,Pbkdf2,我试图在.NET应用程序中使用OpenSSL中的PKCS5_PBKDF2_HMAC函数,方法是使用DllImport属性,如下所示。.NET包装器库OpenSSL.NET()目前没有公开这个OpenSSL函数,因此我尝试以类似的方式公开它,但由于缺乏使用C语言的经验,我失败了 [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] public extern static int PKCS5_PBKDF2_HMAC(st
[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;
}
如果其他人成功地做到了这一点,或者在我的尝试中发现了错误,我将非常感谢任何建议 经过一些尝试和错误之后,我发现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);