java - 使用 BouncyCaSTLe 创建 CMS 消息时出现 FipsUnapprovedOperationError

标签 java encryption bouncycastle fips

我正在尝试使用 BouncyCaSTLe FIPS 1.0.0 for Java 创建 CMS Enveloped 加密消息。我收到以下错误,表明它正在尝试使用 AES 进行随机数生成(这不是 FIPS 模式认可的算法)。

Exception in thread "main" org.bouncycastle.crypto.fips.FipsUnapprovedOperationError: Attempt to create key with unapproved RNG: AES
    at org.bouncycastle.crypto.fips.Utils.validateRandom(Unknown Source)
    at org.bouncycastle.crypto.fips.Utils.validateKeyGenRandom(Unknown Source)
    at org.bouncycastle.crypto.fips.FipsAES$KeyGenerator.<init>(Unknown Source)
    at org.bouncycastle.crypto.fips.FipsAES$KeyGenerator.<init>(Unknown Source)
    at org.bouncycastle.jcajce.provider.ProvAES$39$1.createInstance(Unknown Source)
    at org.bouncycastle.jcajce.provider.BaseKeyGenerator.engineInit(Unknown Source)
    at javax.crypto.KeyGenerator.init(KeyGenerator.java:510)
    at org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder$CMSOutputEncryptor.<init>(Unknown Source)
    at org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder.build(Unknown Source)

首先,我确保 BouncyCaSTLe 作为 JCE 提供程序加载,然后确保它在仅 FIPS 批准的模式下运行。

if(!CryptoServicesRegistrar.isInApprovedOnlyMode()) {
    CryptoServicesRegistrar.setApprovedOnlyMode(true);
}

之后我基本上只使用像 BC FIPS in 100 mini-book 中的示例那样的代码。到目前为止我的代码如下:

private static final String FIPS_PROVIDER = "BCFIPS";

public byte[] encrypt(X509Certificate cert, byte[] dataToEncrypt) throws CertificateEncodingException, CMSException, IOException, InvalidAlgorithmParameterException {
    CMSEnvelopedDataGenerator envelopedGen = new CMSEnvelopedDataGenerator();
    JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter();

    AlgorithmIdentifier algId = paramsConverter.getAlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP, OAEPParameterSpec.DEFAULT);
    JceKeyTransRecipientInfoGenerator recipientInfo = new JceKeyTransRecipientInfoGenerator(cert, algId);
    recipientInfo.setProvider(FIPS_PROVIDER);
    envelopedGen.addRecipientInfoGenerator(recipientInfo);

    CMSProcessableByteArray processableArray = new CMSProcessableByteArray(dataToEncrypt);
    JceCMSContentEncryptorBuilder encryptorBuilder = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES256_CBC);
    encryptorBuilder.setProvider(FIPS_PROVIDER);
    OutputEncryptor outputEncryptor = encryptorBuilder.build();

    return envelopedGen.generate(processableArray, outputEncryptor).getEncoded();
}

如果我不将 BouncyCaSTLe 置于仅 FIPS 批准的模式,则此代码可以正常工作,但我需要能够在此模式下运行。有没有办法告诉 CMSOutputEncryptor 使用不同的 RNG 算法?

最佳答案

您是否尝试过设置 FIPS 批准的 SecureRandom?

CryptoServicesRegistrar.setSecureRandom(
    new FipsDRBG.Builder(
        new BasicEntropySourceProvider(new SecureRandom(), true))
    .build(FipsDRBG.SHA512_HMAC, null, false)
);

然后在您的构建器上(以及您可能需要它的其他地方):

encryptorBuilder.setSecureRandom(CryptoServicesRegistrar.getSecureRandom());

关于java - 使用 BouncyCaSTLe 创建 CMS 消息时出现 FipsUnapprovedOperationError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747175/

相关文章:

java - 如何以更有效的方式从大型集合文件中删除停用词?

java - Spring MVC 服务 Junit 测试用例

用于从标记中查找等级的 Java 代码不正确

Java:将文件模式转换为正则表达式模式

Ruby - 不支持的密码算法 (AES-256-GCM)

java - 调用 PGPOnePassSignature.verify 时签名长度不正确

c# - 从加密或不可读或二进制格式保存和加载字典?

c++ - 加密/解密字节数组 Crypto++

java - 以编程方式在 Java 中生成自签名证书 (X509)、私钥和公钥的问题

java - PGP key 服务器和 Bouncy CaSTLe OpenPGP API Java