按照Java v3.1定义的新包是javacardx.security.derivation
KDFX9.63工作在三个输入:输入秘密,计数器和共享信息。根据生成的关键材料的长度,对散列执行多轮操作以生成最终输出。
我通过JC使用这个KDF生成了64字节的输出(由2轮SHA-256执行),用于16字节-加密密钥、16字节-IV和32字节-MAC密钥。
注意:这只是一个伪代码,把我的问题和必要的细节放在一起。
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);我有以下问题:
df.nextBytes() & KDF循环期间执行的吗? KDF循环将生成32字节的输出(考虑到SHA-256算法),那么API的df.nextBytes()和df.lastBytes()将如何与任何输出预期长度< 32字节一起工作呢?在下一轮中,将增加该KDF计数器中的df.nextBytes()和df.lastBytes() API的?之间如何管理计数器?
发布于 2019-12-04 17:04:05
df.nextBytes()和df.nextBytes()期间执行的?这似乎是我特有的实现。一次执行所有计算可能会更快,但在这种情况下,等待字节的第一个请求仍然是有意义的。另一方面,RAM也经常是一个问题,因此按需生成也是有意义的。不过,这需要更复杂的实现。
输出大小是预先指定的这一事实可能表明,API设计人员至少预见到了一次生成所有关键材料的更简单方法(他们可能在JCF中对其进行同行评审之前创建了一个实现)。
df.nextBytes()和df.lastBytes()将如何处理任何输出预期长度< 32字节?它通常会返回(哈希输出的)最左边的字节,并可能将其余的字节留在缓冲区中。当调用lastBytes时,此缓冲区可能会与状态的其他部分一起被销毁(所以不要忘记这样做)。
请注意,API明确指出,如果您想再次使用DerivationFunction实例,就必须重新初始化它。因此,这是一个非常强烈的迹象,表明他们认为销毁关键材料(这是FIPS和共同标准认证所要求的,而不仅仅是常识)。
其他KDF可能有一种不同的返回字节的方法,但是使用最左边的字节然后向右添加循环非常常见,您可以将其称为通用的。对于ANSI X9.63 KDF来说,情况肯定是这样的,并且在标准中以这种方式明确说明了这一点。
这个KDF计数器中的
df.nextBytes() & df.lastBytes() API的之间将如何管理计数器?
这些是同一个类的方法,不能单独查看,因此它们不是单独的API。类实例可以随时保持状态。它可能只是将计数器作为类变量保存,但是如果它决定在init或第一次nextBytes / lastBytes调用期间生成字节,那么计数器甚至不再是必需的。
https://stackoverflow.com/questions/59180613
复制相似问题