在 C# 中使用尽可能小的数字签名对消息进行签名

2024-02-10

我工作的公司想要创建某种注册流程,最后用户必须输入密钥才能激活他的产品。

我已经搜索并找到了一些解释如何生成密钥的来源。其中之一(如何生成和验证软件许可证密钥? https://stackoverflow.com/questions/599837/how-to-generate-and-validate-a-software-license-key)建议获取一些数据(例如注册数据,与硬件信息相结合),并将其与数据哈希的私钥加密连接起来,并在所有这些基础上计算 Base32 编码。

因此,当将密钥输入到程序中时,程序将解码base32,计算数据的has,并使用公钥验证密钥中的签名是否有效(这样我们就可以确定密钥来自我们公司)。

我发现了 Bouncy castle,但我没有在其中看到任何 schnorr 实现(事实上,我没有在 c# 中找到太多 if 的实现)。我制作小签名的所有努力都失败了(我设法创建的最小签名是 56 字节)。

因此假设数据 + 签名是 64 字节。我的基本 32 字符串将是 64 * 8 / 5,即 103 个字符。与额外的 - 相结合以进行定界,并使其更具可读性,我们得到一些不可读且无法通过电话口述的内容(如果需要)。

那么我错过了什么? 如果我需要制作 32 个字符的密钥,那么我需要 20 个字节的数据 + 哈希值。

我怎么做?

任何使用 .net 密码学或 Bouncy Castle(缺少任何 c# 文档和示例)的示例都会有所帮助。


我了解到 ed25519 是基于 schnorr 的,至少从我读过的内容来看是这样。 寻找 ed25519 的实现并不太难。我发现 libsodium.net 使用 libsodium (一个 c++ lib),它包装了 c++ 库。

还有一个叫做 NaCl.Net (salt.net) 的东西,它是 libsodium.net 的完全托管版本。 NaCl.Net 的文档丢失,并且事情没有按我的预期工作(API 与 libsodium.Net 中的 API 不同)。

无论如何,使用 libsodium.Net,我成功地加密了一条小消息并获得了一条小加密消息。

例如,对于 4 字节的消息,我得到 20 字节的加密消息。 对于 8 字节的消息,我收到一条 24 字节的消息。

额外的 16 个字节一点也不差(密钥大小是 32 个字节,这意味着 256 位,在这个算法中应该很好)

算法细节

  • 密钥交换:Curve25519
  • 加密:XSalsa20流密码
  • 认证:Poly1305 MAC

对消息进行签名会创建更大的签名消息,但我不需要它。

我将计算数据的哈希值,并从中生成密钥(使用加密)。

当收到密钥时,它会被解密,然后将给定的哈希值与在机器上计算的哈希值进行比较。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中使用尽可能小的数字签名对消息进行签名 的相关文章

随机推荐