Java 卡:密钥协议的域参数?

Java Card: domain parameters for key agreement?

使用 class javacard.security.KeyAgreement (Java Card 3.0.1 classic) 可以达成 EC-DH 密钥协议。但是没有定义特定的曲线。据我了解,标准 IEEE P1363 没有指定域参数。那么 Java Card 实现中使用了什么曲线?

很简单:none。您必须设置自己的参数。这取决于卡支持哪种参数。密钥大小也是如此。例如,对于 JCOP(在具有非对称协处理器的芯片上),您可以合理地确定支持最大密钥大小为 320 位的 F(p) 曲线。

所以你应该检查你的 Java Card 运行时环境的用户手册(或任何其他手册)支持哪些曲线。之后,您需要使用各种设置器(除了 setW 之外)自己为 ECPublicKey 设置域参数值,然后生成一个(临时)密钥对并执行 ECDH 密钥协议。显然你也可以设置所有参数包括public/私钥值而不是生成新的密钥对。

对于 JCOP,您可能还需要在生成密钥对之前将域参数复制到 ECPrivateKey


在3.0.1中你只能选择使私钥瞬态化,这意味着所有的域参数也需要存储在RAM中。 public 密钥必须在持久内存(EEPROM 或闪存)中。在 3.0.5 中,可以在 EEPROM/flash 中创建单独的域参数,然后使用 KeyBuilder.buildKeyWithSharedDomain 方法创建密钥。这允许参数保留在 EEPROM 中,而实际密钥可以存储在(瞬态)内存中。


您可以查看您的用户手册,看看ROM中是否存储了任何曲线。但是域参数占用了相当多的space,所以这不太可能。我个人最喜欢 BrainpoolP256r1 等 Brainpool 曲线,但也可以使用 P-256 等 NIST 曲线。 Bouncy Castle(核心)里面有一大堆曲线。