首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用javacardx.security.derivation定义的KDF (X9.63)提取加密和MAC密钥

如何使用javacardx.security.derivation定义的KDF (X9.63)提取加密和MAC密钥
EN

Stack Overflow用户
提问于 2019-12-04 15:55:37
回答 1查看 593关注 0票数 1

按照Java v3.1定义的新包是javacardx.security.derivation

https://docs.oracle.com/en/java/javacard/3.1/jc_api_srvc/api_classic/javacardx/security/derivation/package-summary.html

KDFX9.63工作在三个输入:输入秘密,计数器和共享信息。根据生成的关键材料的长度,对散列执行多轮操作以生成最终输出。

我通过JC使用这个KDF生成了64字节的输出(由2轮SHA-256执行),用于16字节-加密密钥、16字节-IV和32字节-MAC密钥。

注意:这只是一个伪代码,把我的问题和必要的细节放在一起。

代码语言:javascript
复制
DerivationFunction df = DerivationFunction.getInstance(DerivationFunction.ALG_KDF_ANSI_X9_63, false);
df.init(KDFAnsiX963Spec(MessageDigest.ALG_SHA_256, input, sharedInfo, (short) 64);

SecretKey encKey = KeyBuilder.buildKey(KeyBuilder.TYPE_AES, (short)16, false);
SecretKey macKey = KeyBuilder.buildKey(KeyBuilder.TYPE_HMAC, (short)32, false);

df.nextBytes(encKey); 
df.nextBytes(IVBuffer, (short)0, (short)16);
df.lastBytes(macKey);

我有以下问题:

  1. 什么时候执行KDF?这些是在df.init()或df.nextBytes() & KDF循环期间执行的吗? KDF循环将生成32字节的输出(考虑到SHA-256算法),那么API的df.nextBytes()df.lastBytes()将如何与任何输出预期长度< 32字节一起工作呢?在下一轮中,将增加该KDF计数器中的
  2. ,然后在df.nextBytes()df.lastBytes() API的?

之间如何管理计数器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-04 17:04:05

  1. 什么时候执行KDF?这些操作是在df.init()还是在df.nextBytes()df.nextBytes()期间执行的?

这似乎是我特有的实现。一次执行所有计算可能会更快,但在这种情况下,等待字节的第一个请求仍然是有意义的。另一方面,RAM也经常是一个问题,因此按需生成也是有意义的。不过,这需要更复杂的实现。

输出大小是预先指定的这一事实可能表明,API设计人员至少预见到了一次生成所有关键材料的更简单方法(他们可能在JCF中对其进行同行评审之前创建了一个实现)。

  1. 1 KDF循环将生成32字节的输出(考虑SHA-256算法),那么API的df.nextBytes()df.lastBytes()将如何处理任何输出预期长度< 32字节?

它通常会返回(哈希输出的)最左边的字节,并可能将其余的字节留在缓冲区中。当调用lastBytes时,此缓冲区可能会与状态的其他部分一起被销毁(所以不要忘记这样做)。

请注意,API明确指出,如果您想再次使用DerivationFunction实例,就必须重新初始化它。因此,这是一个非常强烈的迹象,表明他们认为销毁关键材料(这是FIPS和共同标准认证所要求的,而不仅仅是常识)。

其他KDF可能有一种不同的返回字节的方法,但是使用最左边的字节然后向右添加循环非常常见,您可以将其称为通用的。对于ANSI X9.63 KDF来说,情况肯定是这样的,并且在标准中以这种方式明确说明了这一点。

这个KDF计数器中的

  1. 在下一轮中递增,那么在df.nextBytes() & df.lastBytes() API的

之间将如何管理计数器?

这些是同一个类的方法,不能单独查看,因此它们不是单独的API。类实例可以随时保持状态。它可能只是将计数器作为类变量保存,但是如果它决定在init或第一次nextBytes / lastBytes调用期间生成字节,那么计数器甚至不再是必需的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59180613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档