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에 알리는 방법이 있습니까?
감사합니다 : 빌더 (그리고 모든 곳이 그것을 필요로 할 수있다)에
다음! 'encryptorBuilder.setSecureRandom()'호출을 추가하면 저에게 효과적입니다. 나는 이미 자신의 인스턴스를 설정하기 위해'CryptoServicesRegistrar.setSecureRandom()'호출을 수행했다. 나는 그 기능이 무엇을했는지 오해하고 그것이 글로벌 디폴트를 설정한다고 가정했다 ... – Michael