我需要能够在 bouncy-castle FIPS 库中的输入键上使用 HKDF 算法。在通常的充气城堡库中,有一种简单的方法可以做到这一点
HKDFBytesGenerator hkdfBytesGenerator = new HKDFBytesGenerator(new SHA256Digest());
HKDFParameters hkdfParameters = new HKDFParameters(inputKey, salt, info);
hkdfBytesGenerator.init(hkdfParameters);
byte[] hkdf = new byte[32];
hkdfBytesGenerator.generateBytes(hkdf, 0, 32);
但是在 bouncy-castle FIPS 中,我还不知道如何执行相同的操作。我需要能够提供
salt
和 info
参数。
HKDFKeyBuilder#build
仅执行“提取”部分,而不执行“扩展”,因此没有 info
作为参数。类似地命名为 HKDFBytesGenerator
,但不执行“提取”,因此不包含 salt
。
答案一直就在我身边。正如我提到的
HKDFKeyBuilder
仅执行“提取”而 HKDFBytesGenerator
仅执行“扩展”,因此您需要同时使用两者。您需要首先使用 HKDFKeyBuilder
提取密钥,然后使用 HKDFBytesGenerator
展开它。根据您的其他参数,代码应该与此类似
HKDFKeyBuilder hkdfKeyBuilder = FipsKDF.HKDF_KEY_BUILDER.withSalt(salt).withPrf(AgreementKDFPRF.SHA256_HMAC);
byte[] extractedKey = hkdfKeyBuilder.build(inputKey).getKey();
AgreementOperatorFactory factory = new AgreementOperatorFactory();
KDFCalculator<AgreementKDFParameters> kdfCalculator = factory.createKDFCalculator(FipsKDF.HKDF.withPRF(AgreementKDFPRF.SHA256_HMAC).using(extractedKey).withIV(info));
byte[] hkdf = new byte[32];
kdfCalculator.generateBytes(hkdf);
return hkdf;