[英]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,在这个算法中应该是好的)
算法细节
对消息签名会创建更大的签名消息,但我不需要它。
我将为数据计算 hash,并从中生成一个密钥(使用加密)。
收到密钥后,将对其进行解密,然后将给定的 hash 与在机器上计算的 hash 进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.