Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenSSL';s PKCS5_PBKDF2_HMAC来自.NET_.net_C_Openssl_Pbkdf2 - Fatal编程技术网

使用OpenSSL';s PKCS5_PBKDF2_HMAC来自.NET

使用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

我试图在.NET应用程序中使用OpenSSL中的PKCS5_PBKDF2_HMAC函数,方法是使用DllImport属性,如下所示。.NET包装器库OpenSSL.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;
}

如果其他人成功地做到了这一点,或者在我的尝试中发现了错误,我将非常感谢任何建议

经过一些尝试和错误之后,我发现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);