Java用BouncyCastle FIPS 1.0.0を使用してCMSエンベロープ暗号化メッセージを作成しようとしています。乱数生成用にAESを使用しようとしていることを示す次のエラーが表示されます(FIPSモードの承認アルゴリズムではありません)。BouncyCastleでCMSメッセージを作成中にFipsUnapprovedOperationError
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();
}
私は専用モード承認FIPSにはBouncyCastleを入れていない場合、このコードは正常に動作しますが、私はこのモードで実行できるようにする必要があります。別のRNGアルゴリズムを使用するようにCMSOutputEncryptorに指示する方法はありますか?
ありがとう! 'encryptorBuilder.setSecureRandom()'呼び出しを追加することは私のために働いていました。私はすでに 'CryptoServicesRegistrar.setSecureRandom()'呼び出しを行って自分のインスタンスをそこに設定していました。私はその機能が何をしているのか誤解していて、それがグローバルなデフォルトを設定していると仮定します... – Michael