2017-05-02 13 views
1

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に指示する方法はありますか?

答えて

3

FIPS認定のSecureRandomを設定しましたか?

あなたのビルダーで、その後
CryptoServicesRegistrar.setSecureRandom(
    new FipsDRBG.Builder(
     new BasicEntropySourceProvider(new SecureRandom(), true)) 
    .build(FipsDRBG.SHA512_HMAC, null, false) 
); 

(でもどこでも他にあなたがそれを必要とする場合があります):

encryptorBuilder.setSecureRandom(CryptoServicesRegistrar.getSecureRandom()); 
+0

ありがとう! 'encryptorBuilder.setSecureRandom()'呼び出しを追加することは私のために働いていました。私はすでに 'CryptoServicesRegistrar.setSecureRandom()'呼び出しを行って自分のインスタンスをそこに設定していました。私はその機能が何をしているのか誤解していて、それがグローバルなデフォルトを設定していると仮定します... – Michael

関連する問題