Bouncycastle과 함께 "강한"JRE 정책 파일 사용
-
06-09-2019 - |
문제
암호화 초보자 여기서 ... 아래 코드와 함께 Bouncycastle을 사용하여 128 비트 암호화를하려고합니다.
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.X509Certificate;
import org.apache.commons.io.IOUtils;
import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
import org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class Test {
public static void main(String[] args) throws Throwable {
Security.addProvider(new BouncyCastleProvider());
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream keyStoreFile = new FileInputStream("test.p12");
try {
keyStore.load(keyStoreFile, "test12".toCharArray());
} finally {
keyStoreFile.close();
}
X509Certificate certificate = (X509Certificate) keyStore
.getCertificate(keyStore.aliases().nextElement());
OutputStream output = new BufferedOutputStream(new FileOutputStream(
"test.out"));
try {
InputStream input = new FileInputStream("test.in");
try {
CMSEnvelopedDataStreamGenerator generator = new CMSEnvelopedDataStreamGenerator();
generator.addKeyTransRecipient(certificate);
OutputStream encryptedOutput = generator.open(output,
CMSEnvelopedDataGenerator.AES128_WRAP, 128,
BouncyCastleProvider.PROVIDER_NAME);
try {
IOUtils.copy(input, encryptedOutput);
} finally {
encryptedOutput.close();
}
} finally {
input.close();
}
} finally {
output.close();
}
}
}
하지만이 오류가 발생합니다.
Exception in thread "main" org.bouncycastle.cms.CMSException: key inappropriate for algorithm.
at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source)
at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source)
at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source)
at hk.gov.gld.etb.uploading.pkcs7.Test.main(Test.java:45)
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at org.bouncycastle.cms.CMSEnvelopedGenerator$RecipientInf.toRecipientInfo(Unknown Source)
... 4 more
내가 사용한 인증서는 다음과 같이 JDK의 KeyTool 프로그램을 사용하여 생성되었습니다.
keytool -genkeypair -dname "cn=test" -alias test -keystore test.p12 -storepass test12 -validity 180 -storetype pkcs12 -keyalg rsa
내가 사용하는 JDK 버전은 6이고 내가 사용한 Bouncycastle 버전은 141입니다.
내가 올바른 방법으로하고 있습니까? 128 비트 암호화를 수행하려면 무제한 강도 정책 파일을 설치해야합니까?
도움은 대단히 감사합니다.
감사!
해결책 2
Bouncycastle Library의 버전 141에는 버그가있는 것 같습니다. 최신 버전 (143)으로 업그레이드하면 동일한 코드가 작동했습니다.
다른 팁
나는 그렇게 믿습니다 - 당신은 us_export_policy.jar 및 local_policy.jar가 필요합니다. 우리는 프로젝트에서 똑같은 일을해야했고, 이로 인해 고정되었습니다.
생성 및 사용 된 열쇠는 그렇지 않으면 괜찮을 것입니다. 이 두 개의 항아리를 JRE/LIB/Security에 추가하면 바로 해결해야합니다.
제휴하지 않습니다 StackOverflow