【问题标题】:Sign a message with as small as possible digital signature in c#在 c# 中使用尽可能小的数字签名对消息进行签名
【发布时间】:2017-02-24 14:07:43
【问题描述】:

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

我已经搜索并找到了一些解释如何生成密钥的资源。其中一位 (How to generate and validate a software license key?) 建议获取一些数据(如注册数据,结合硬件信息),并将其与数据散列的私钥加密相连接,然后计算 base32 编码。

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

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

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

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

我该怎么做?

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

【问题讨论】:

    标签: c# digital-signature


    【解决方案1】:

    我了解到 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 字节,即 256 位,在这个算法中应该是好的)

    算法细节

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

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

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

    【讨论】:

    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多