C# 用尽可能小的数字签名在c语言中为消息签名#

C# 用尽可能小的数字签名在c语言中为消息签名#,c#,digital-signature,C#,Digital Signature,我工作的公司希望创建某种注册流程,在该流程中,用户必须输入密钥才能激活其产品 我已经搜索并找到了一些解释如何生成密钥的来源。其中一个()建议获取一些数据(比如注册数据,与硬件信息相结合),并使用数据上散列的私钥加密对其进行加密,然后在此基础上计算base32编码 因此,当在程序中输入密钥时,程序将解码base32,计算数据的has,并使用公钥验证密钥中的签名是否有效(因此我们可以确保密钥来自我们公司) 我已经了解了Bouncy castle,但是我没有在其中看到任何schnorr实现(事实上,我

我工作的公司希望创建某种注册流程,在该流程中,用户必须输入密钥才能激活其产品

我已经搜索并找到了一些解释如何生成密钥的来源。其中一个()建议获取一些数据(比如注册数据,与硬件信息相结合),并使用数据上散列的私钥加密对其进行加密,然后在此基础上计算base32编码

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

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

假设数据+签名是,比如说,64字节。我的基32字符串将是64*8/5,即103个字符。再加上额外的-用于定界,使它更可读,我们得到一些不可读的东西,不能通过电话听写(如果需要)

那么我错过了什么? 如果我需要制作一个32个字符的密钥,那么我需要20字节的数据+散列

我该怎么做


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

我了解到ed25519是基于schnorr的,至少从我所读到的内容来看是如此。 找到ed25519的实现并不难。我已经找到了使用BLUTAL(C++ C++库)的LbSoDuUM.NET,它封装了C++库。 还有一种称为NaCl.Net(salt.Net)的东西,它是libnail.Net的一个完全管理版本。 NaCl.Net的文档丢失了,事情并没有像我预期的那样正常工作(API与libNaCl.Net中的API不同)

总之,我用libnaude.Net加密了一条小消息,得到了一条加密的小消息

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

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

算法细节

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

对消息签名会创建一个更大的签名消息,但我不需要它。 我将为数据计算一个散列,并从中生成一个密钥(使用加密)


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

以下项目也可以帮助生成密钥:我已经看到了它,需要看看它是否也有帮助,但现在,我已经有了一个很好的解决方案