带 ECC 的串行密钥

div*_*ivB 2 security cryptography code-access-security elliptic-curve

我想要(或创建)基于椭圆密钥加密的序列密钥。我想做的是将信息编码在序列中,这些信息可以公开验证,但只能由我创建。最初的想法来自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。但还有什么?

Ilm*_*nen 5

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

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

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

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


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

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