2017-05-02 16 views
1

Java 용 BouncyCastle FIPS 1.0.0을 사용하여 CMS Enveloped 암호화 메시지를 만들려고합니다. 난수 생성을 위해 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의 예제와 같은 코드를 사용하고 있습니다. 다음과 같이 내가 지금까지 가지고있는 코드는 : 만 모드를 승인 FIPS에 BouncyCastle을 넣어하지 않는 경우,이 코드는 잘 작동

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

,하지만 난이 모드에서 실행 할 수 있어야합니다. 다른 RNG 알고리즘을 사용하도록 CMSOutputEncryptor에 알리는 방법이 있습니까?

답변

3

FIPS 승인 SecureRandom을 설정해 보셨습니까?

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

감사합니다 : 빌더 (그리고 모든 곳이 그것을 필요로 할 수있다)에

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

! 'encryptorBuilder.setSecureRandom()'호출을 추가하면 저에게 효과적입니다. 나는 이미 자신의 인스턴스를 설정하기 위해'CryptoServicesRegistrar.setSecureRandom()'호출을 수행했다. 나는 그 기능이 무엇을했는지 오해하고 그것이 글로벌 디폴트를 설정한다고 가정했다 ... – Michael