Java Card:关键协议的域参数?

时间:2015-09-29 16:03:22

标签: cryptography smartcard javacard

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

1 个答案:

答案 0 :(得分:8)

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

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

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

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

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