2

我想(或创建)基于椭圆密钥加密的串行密钥。我想要做的是对序列中的信息进行编码,这些信息可以公开验证但只能由我创建。最初的想法来自http://www.ssware.com/cryptolicensing/cryptolicensing_net.htm,他们可以在其中创建信息被加密的连续剧。但是,这是基于 RSA 的,因此会产生大量数据。因此,我想自己构建类似的东西。

然后我发现: http: //www.codeguru.com/cpp/cpp/algorithms/general/article.php/c12799/Product-Keys-Based-on-Elliptic-Curve-Cryptography.htm

但是,我认为这没有任何好处:他们选择了应用程序和创建者需要知道的域参数。公钥用于加密(生成序列),而私钥在应用程序中并用于解密。但是,知道域参数和私钥,很容易推导出 ECIES 的公钥,对吧?

下一个想法是对信息进行任意编码,并在其上附加基于 ECDSA 的签名。但这会导致序列号很大。

我真正在寻找的是一个类似于http://ellipter.com的解决方案,他们使用正确的概念:生成序列的私钥和验证它们的公钥。他们在屏幕截图中显示的密钥非常短:对于 128 位密钥,只有大约 30 个字符。

这样做的正确方法是什么?我错过了正确的方案吗?它不可能是 ECDSA,它不可能是 ECIES。但还有什么?

4

1 回答 1

4

您需要的是一个椭圆曲线数字签名方案,例如ECDSA

基本上,您的密钥生成服务器将持有密钥对的私有部分,而您分发的软件将包含公共部分。您的序列号将包含一个简单的序列号,以及使用私钥对该号码的签名。当用户输入数字时,软件会使用其公钥检查签名是否有效。

您也可以对产品激活密钥使用相同的方案;在这种情况下,您要签名的数据不仅仅是一个序列号,而是某种识别用户的摘要字符串,可能还有他们正在安装软件的系统的某些功能。

现在,坏消息是,不幸的是,具有非平凡安全级别的 ECDSA 签名对于许可证密钥来说仍然很长。您可以通过降低安全级别来减少签名长度,但随后可以通过蛮力伪造签名。基本上,您将在安全性和可用性之间进行权衡。您还可以尝试其他具有短签名的签名方案,例如Schnorr 签名或可能类似于本文中描述的基于 McEliece 的签名方案,但即使这些也可能非常适合用户可键入的许可证密钥。


最初遇到 RSA 签名形式的数字签名的人通常会感到困惑的是,RSA 密码系统有点不寻常,因为相同的基本算法可以用于公钥 加密和数字签名,而且,级别,这两个操作是双重的,因此 RSA 签名操作可以被视为“使用私钥加密”,而签名验证可以被视为“使用公钥解密”(这与您所做的相反)对于普通的公钥加密)。

然而,对于大多数其他公钥密码系统,没有这样的对偶性:一般来说,数字签名方案与公钥加密方案完全不同(尽管它们通常基于类似的数学问题)。事实上,即使对于 RSA,一旦您开始考虑诸如padding之类的细节,签名和加密操作也会变得不同,如果您想将基本的“教科书 RSA”算法转变为实际上可以用作安全且实用的密码系统的东西,这是必不可少的。

于 2013-06-27T20:37:10.193 回答