C# 在C中使用OpenSSL库的SHA256方法#

C# 在C中使用OpenSSL库的SHA256方法#,c#,openssl,wrapper,sha,sha256,C#,Openssl,Wrapper,Sha,Sha256,我正在为OpenSSL for C#编写一个包装器,实际上现在一切都在为我工作,但有一个方法有问题。(我知道OpenSSL.Net,它不能按我的需要工作,而且它缺少很多方法) OpenSSL 1.0.1有我想要使用的SHA256。OpenSSL lib C代码中的方法本身: unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md) { SHA256_CTX c; static unsign

我正在为OpenSSL for C#编写一个包装器,实际上现在一切都在为我工作,但有一个方法有问题。(我知道OpenSSL.Net,它不能按我的需要工作,而且它缺少很多方法)

OpenSSL 1.0.1有我想要使用的SHA256。OpenSSL lib C代码中的方法本身:

unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md)
{
    SHA256_CTX c;
    static unsigned char m[SHA256_DIGEST_LENGTH];

    if (md == NULL)
        md = m;
    SHA256_Init(&c);
    SHA256_Update(&c, d, n);
    SHA256_Final(md, &c);
    OPENSSL_cleanse(&c, sizeof(c));
    return (md);
} 
函数本身返回一个指针,作为参数,它需要输入数据、要散列的数据长度以及散列的对象

我用下一种方式来包装它:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr SHA256(byte[] data, long len, ref byte[] result);
byte[] d = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaa");
byte[] r = new byte[32];
IntPtr x = NOpenSSL.Wrapper.SHA256(d, d.Length, ref r);
Console.WriteLine(d.Length + " " + x + " " + r.Length + " " + Encoding.ASCII.GetString(r));
我正在尝试用下一种方式运行它:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr SHA256(byte[] data, long len, ref byte[] result);
byte[] d = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaa");
byte[] r = new byte[32];
IntPtr x = NOpenSSL.Wrapper.SHA256(d, d.Length, ref r);
Console.WriteLine(d.Length + " " + x + " " + r.Length + " " + Encoding.ASCII.GetString(r));
结果是:
16 1838788744 1
d.Length
是16字节,我得到x作为指针,OK,
r.Length
变成1字节,这是不可能的

如果我没有
ref
方法中的
byte[]
只需简单地给它变量
r
中的任何更改

谁能帮帮我我做错了什么


提前感谢您的帮助

在对OpenSSL C源代码进行了一些研究,并对C#指针进行了实验并对其进行封送处理后,
SHA256
方法没有将结果散列放入变量
md
,而是返回一个指向散列的指针。(首先我认为它是SHA256结构的指针,但它是实际的散列。)

工作C#代码如下所示:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr SHA256(byte[] data, long len, byte[] result);
-

由于我们没有使用
SHA256
方法的第三个变量(我们只是传递
null
),因此需要从
dlliport
中删除
ref

(注意:说明:如果md为NULL,则摘要将放置在静态数组中。注意:将md设置为NULL不是线程安全的。)


使用
SHA512
是完全相同的,只是我们需要在代码中的两个位置替换方法名,并更改
输出
字节[]
length
32
64

。NET Core 5为非Windows平台的OpenSSL提供了包装,是迄今为止我所能想到的最完整的完整包装器,可用于完整的单元测试用例。