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

时间:2017-02-24 14:07:44

标签: c# digital-signature

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

我已经搜索过并找到了解释如何生成密钥的几个来源。其中一个(How to generate and validate a software license key?)建议采集一些数据(如注册数据,结合硬件信息),并将其与数据哈希的私钥加密联系起来,并在所有这些上计算base32编码

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

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

因此,假设数据+签名是64字节。我的基本32字符串将是64 * 8/5,这是103 chars.combined with extra - for delimitation,并且使它更具可读性,我们得到的东西是不可读的,不能由电话决定(如果需要)。

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

我该怎么做?

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

1 个答案:

答案 0 :(得分:1)

我已经了解到ed25519基于schnorr,至少从我读过的内容来看。 寻找ed25519的实现并不是太难。我找到了使用libsodium(一个c ++ lib)的libsodium.net,它包装了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

签名邮件会创建一个更大的签名邮件,但我不需要它。 我将计算数据的哈希值,并从中生成密钥(使用加密)。

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