2017-05-02 2 views
1

Ich versuche, eine CMS Enveloped verschlüsselte Nachricht mit BouncyCastle FIPS 1.0.0 für Java zu erstellen. Ich erhalte den folgenden Fehler, der angibt, dass versucht wird, AES für die Generierung von Zufallszahlen zu verwenden (dies ist kein genehmigter Algorithmus für den FIPS-Modus).FipsUnapprovedOperationError beim Erstellen einer CMS-Nachricht mit BouncyCastle

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) 

Zuerst stelle ich sicher, BouncyCastle als JCE Provider geladen wird und dann stelle ich sicher, dass es nur im FIPS-Modus zugelassen läuft.

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

Danach bin ich im Grunde mit nur Code wie das Beispiel im BC FIPS in 100 mini-book. Der Code, den ich bisher habe, ist wie folgt:

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(); 
} 

Wenn ich BouncyCastle in die FIPS nicht nur Modus genehmigt setzen dann dieser Code funktioniert gut, aber ich muss in diesem Modus ausführen können. Gibt es eine Möglichkeit, dem CMSOutputEncryptor mitzuteilen, einen anderen RNG-Algorithmus zu verwenden?

Antwort

3

Haben Sie versucht, ein FIPS-genehmigtes SecureRandom einzurichten?

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

dann auf Ihrem Baumeister (und wo auch immer Sie können es brauchen):

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

Dank! Das Hinzufügen des 'encryptorBuilder.setSecureRandom()' Aufrufs funktionierte für mich. Ich hatte bereits den 'CryptoServicesRegistrar.setSecureRandom()' Aufruf gemacht, um dort meine eigene Instanz zu setzen. Ich habe falsch verstanden, was diese Funktion getan hat und angenommen, dass sie einen globalen Standard gesetzt hat ... – Michael

Verwandte Themen