(开放式)PGP 中的 ECC

信息安全 pgp 电子抄送
2021-09-01 06:50:30

到目前为止,(开放)PGP 中对ECC (椭圆曲线加密)的支持如何?似乎GnuPG (The GNU Privacy Guard) 没有正式的实现 - 但我确实在 Google Code 上找到了gnupg-ecc 项目( ECC-enabled GnuPG per RFC 6637 ):

该项目将 OpenPGP 中的椭圆曲线密码学支持作为最终用户功能变为现实。用户可以简单地选择一个 ECC 密钥生成选项

gpg2 --gen-key

然后使用生成的公钥,因为他们通常会使用任何其他公钥,如此 处所示

我知道赛门铁克支持 ECC。有理由不使用 ECC 吗?

编辑

我做了一些更多的研究,发现 ECC 很久以前就找到了通往 gnupg 主线的方法,但仅限于 开发人员版本

$ gpg2 --expert --gen-key
gpg: NOTE: THIS IS A DEVELOPMENT VERSION!
gpg: It is only intended for test purposes and should NOT be
gpg: used in a production environment or with production keys!
Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
    (7) DSA (set your own capabilities)
    (8) RSA (set your own capabilities)
    (9) ECDSA and ECDH
   (10) ECDSA (sign only)
   (11) ECDSA (set your own capabilities)
Your selection?`
3个回答

我看到您可能不想使用ECC的两个主要原因

实际原因:通信必然涉及发送方和接收方两方。只有发送方和接收方都支持 ECC 才能使用。正如您所注意到的,现有的、已部署的实现不一定能满足它。如果您使用 ECC 公钥,人们可能会向您发送使用该密钥加密的消息,或者使用该密钥验证您的签名,前提是他们的 OpenPGP 实现包含相关代码。

因此,您选择 ECC 还是不选择 ECC 取决于您是想最大化互操作性还是更愿意成为“早期采用者”(尽管在 ECC 的情况下,真正的早期采用者已经存在;ECC 正在成为主流)。

道德原因:从数学上讲,我们没有证据证明我们使用的任何加密算法确实对攻击具有鲁棒性。我们甚至不知道在数学上是否有可能对攻击具有鲁棒性。目前,我们评估任何密码算法强度的唯一方法是定义它,然后让很多密码学家研究它几年。如果这些聪明人都没有发现算法有什么问题,那么你就可以知道,如果算法很弱,那么,至少,它不是明显的弱。

椭圆曲线已于 1985 年被提出作为适用于密码学的对象(由 Koblitz 和 Miller 独立提出)。在此之前,椭圆曲线的数学已经研究了大约 40 年。因此,ECC 可以进行大约 70 年的曝光,其中 30 年是在绝对加密的环境中。这还不错。

RSA 所基于的整数分解可以拥有 35 年的密码学经验(RSA 于 1978 年提出),而基础数学的使用时间则超过2500 年因此,可以说 RSA 的安全性比椭圆曲线的安全性“更容易理解”。


就我个人而言,我认为 ECC 已经足够成熟,可以部署了,而且由于 ECC 非常流行,实现变得司空见惯,我们可以期待 GnuPG 很快就会自我调整。因此,我的建议是:ECC 是可以的,只要你准备好几年来遇到一些互操作性问题。

(ECC 部署的一个黑点是很少有“通用”ECC 实现;大多数实现特定于一组受支持的曲线,通常仅限于 NIST P-256 和 P-384 两条曲线。曲线的选择因为您的密钥因此对互操作性产生了重大影响。不过,P-256 对安全性很好,因此您可以使用它而不必担心。)

目前,GnuPG 2.1 beta 支持 ECC。您可以从源代码编译它并亲自查看是否支持以下曲线:

nistp256 nistp384 nistp521 脑池P256r1 脑池P384r1 脑池P512r1 secp256k1

在 GPG 中,为了安全起见,人们会远离大脑池和 nist 曲线。edDSA、蒙哥马利和爱德华兹曲线都很好。ed25519 幸运的是,目前在没有任何诡计的情况下部署。

虽然它只是用于签名/认证/认证。加密将随之而来。

ietf.org 上的邮件列表是很好的起点,也可以查看 cryp.to。

将 ECC 与愚蠢的实现一起使用甚至比使用 RSA 更糟糕。