【问题标题】:Serial keys with ECC带 ECC 的串行密钥
【发布时间】:2013-06-27 19:12:08
【问题描述】:

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

【问题讨论】:

    标签: security cryptography code-access-security elliptic-curve


    【解决方案1】:

    你需要的是一条椭圆曲线digital signature scheme,比如ECDSA

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

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

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


    第一次遇到 RSA 签名形式的数字签名的人通常会感到困惑的是,RSA cryptosystem 有点不寻常,因为相同的基本算法可以用于两者public-key encryption而对于数字签名,在底层,这两种操作是对偶的,所以RSA签名操作可以看成“用私钥加密”,而签名验证可以看成“用公钥解密”(这与您对普通公钥加密所做的相反)。

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

    【讨论】:

    • 嗯,我详细说明了我已经实现了一个方案。我知道签名方案、ECC、RSA。我的问题是 Ellipter 如何能够创建如此 short 序列号。此外,它不能是普通签名,因为数据是额外加密的。
    • 我在回答后注意到了这一点,并在上面添加了一些内容。他们可能在使用除 ECDSA 之外的其他签名方案,但他们也可能只是在安全级别上略过。在不知道他们实际使用的是什么算法的情况下,很难说出“128 位密钥强度”的真正含义。
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2017-03-12
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多