P. *_*man 4 cryptography smartcard javacard
使用类javacard.security.KeyAgreement(Java Card 3.0.1 classic)可以制定EC-DH密钥协议.但是没有定义具体的曲线.据我所知,标准IEEE P1363没有指定域参数.那么Java Card实现中使用了什么曲线?
这很简单:没有.您必须设置自己的参数.这取决于卡支持哪种参数.密钥大小也是如此.对于JCOP(在具有非对称协处理器的芯片上),您可以合理地确定例如支持最大密钥大小为320位的F(p)上的曲线.
因此,您应该查看Java Card运行时环境的用户手册(或任何其他手册)支持哪些曲线.之后,您需要自己设置域参数值,以便ECPublicKey使用各种setter(除了之外setW),然后生成(临时)密钥对并执行ECDH密钥协议.显然,您还可以设置所有参数,包括公钥/私钥值,而不是生成新的密钥对.
在JCOP的情况下,您可能需要ECPrivateKey在生成密钥对之前将域参数复制到该参数.
在3.0.1中,您只能选择使私钥成为瞬态,这意味着所有域参数也需要存储在RAM中.公钥必须位于永久存储器(EEPROM或闪存)中.在3.0.5中,可以在EEPROM/flash中创建单独的域参数,然后使用该KeyBuilder.buildKeyWithSharedDomain方法创建密钥.这允许参数保留在EEPROM中,而实际的键可以存储在(瞬态)存储器中.
您可以查看用户手册,查看是否有任何曲线存储在ROM中.但是域参数占用了相当多的空间,所以这不是那么可能.我个人最喜欢BrainpoolP256r1这样的Brainpool曲线,但也可以使用P-256等NIST曲线.Bouncy Castle(核心)里面有一大堆曲线.