繁体   English   中英

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

[英]Sign a message with as small as possible digital signature in c#

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

我已经搜索并发现很少有解释如何生成密钥的资源。 其中之一( How to generate and validate a software license key? )建议获取一些数据(如注册数据,结合硬件信息),并将其与 hash 的私钥加密相连接,并在所有这些上,计算base32编码。

所以当密钥输入到程序中时,程序会解码base32,计算出数据的大小,并用公钥验证密钥中的签名是有效的(这样我们就可以确定密钥来自外部公司)。

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

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

那么我错过了什么? 如果我需要创建一个 32 个字符的密钥,那么我需要 20 个字节的数据 + hash。

我怎么做?

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

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

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

无论如何,通过 libsodium.Net,我设法加密了一条小消息并获得了一条小的加密消息。

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

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

算法细节

  • 密钥交换:Curve25519
  • 加密:XSalsa20 stream 密码
  • 身份验证:Poly1305 MAC

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

我将为数据计算 hash,并从中生成一个密钥(使用加密)。

收到密钥后,将对其进行解密,然后将给定的 hash 与在机器上计算的 hash 进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM