문제

암호화 초보자 여기서 ... 아래 코드와 함께 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에 추가하면 바로 해결해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top