在c#中使用OpenSSL库的SHA256方法
本文关键字:库的 SHA256 方法 OpenSSL | 更新日期: 2023-09-27 18:16:26
我正在为c#编写OpenSSL包装器,实际上现在一切都为我工作,但我有一个方法的问题。(我知道OpenSSL。Net,它只是不工作,因为我需要它,它缺少很多方法)。
OpenSSL 1.0.1有SHA256,我想使用。方法本身在OpenSSL库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作为指针,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);
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
方法的第三个变量(我们只是传递null
代替),因此需要从DllImport
中删除ref
。
(注意:https://www.openssl.org/docs/manmaster/crypto/sha.html表示:如果md为NULL,则摘要放在静态数组中。注意:将md设置为NULL不是线程安全的。
使用SHA512
是完全相同的,只是我们需要在代码中的两个地方替换方法名称,并将output
字节[]length
从32
更改为64
。