【问题标题】:Using SHA256 method of OpenSSL library in C#在 C# 中使用 OpenSSL 库的 SHA256 方法
【发布时间】:2015-10-14 12:41:58
【问题描述】:

我正在为 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 1d.Length 是 16 OK,我得到 x 作为指针 OK,r.Length 变成 1 字节,这是不可能的。

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

谁能帮帮我,我做错了什么?

提前感谢您的帮助!

【问题讨论】:

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

标签: c# openssl wrapper sha sha256


【解决方案1】:

在对 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 byte[] length32改为64

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2016-10-24
    • 2023-03-10
    • 2013-02-09
    • 1970-01-01
    • 2020-02-25
    • 2012-01-19
    相关资源
    最近更新 更多