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

时间:2015-10-07 02:34:46

标签: c# openssl wrapper sha sha256

我为C#编写OpenSSL包装器,实际上现在一切都在为我工作,但是我遇到了一种方法的问题。 (我知道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));

我得到的结果是: 16 1838788744 1 d.Length是16好的,我把x作为指针OK,r.Length变为1字节是不可能的。

如果我不是ref方法中的byte[],只需简单地将其赋予变量r即可。

任何人都可以帮助我,请问我做错了什么?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在完成了一些OpenSSL C源代码并尝试使用C#指针和Marshaling后,SHA256方法没有将结果哈希值放在变量md中,但它返回一个指向哈希值。 (首先我认为它是SHA256-struct的指针,但它是实际的哈希值。)

正在使用的C#代码如下:

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

-

byte[] data = Encoding.ASCII.GetBytes("some_data_to_hash");

IntPtr r = NOpenSSL.Wrapper.SHA256(data, data.Length, null);
byte[] output = new byte[32];
Marshal.Copy(r, output, 0, output.Length);

// output contains now the 32 bytes of the hashed data

由于我们没有使用SHA256方法的第3个变量(我们只是通过null),因此需要从ref中删除DllImport。< / p>

(注意:https://www.openssl.org/docs/manmaster/crypto/sha.html说:如果md为NULL,则摘要放在静态数组中。注意:将md设置为NULL不是线程安全的。)

使用SHA512完全相同,我们需要在代码中的两个位置替换方法名称,并将output字节[] length32更改为64