Использование надежных файлов политик JRE с BouncyCastle

Новичок в криптографии здесь... Я пытаюсь выполнить 128-битное шифрование с помощью BouncyCastle с кодом ниже.

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

Сертификат, который я использовал, был сгенерирован с помощью программы keytool JDK следующим образом:

keytool -genkeypair -dname "cn=test" -alias test -keystore test.p12 -storepass test12 -validity 180 -storetype pkcs12 -keyalg rsa

Версия JDK, которую я использую, — 6, а версия BouncyCastle — 141.

Я делаю это правильно? Нужно ли мне по-прежнему устанавливать файлы политик неограниченной надежности для 128-битного шифрования?

Помощь очень ценится.

Спасибо!


person Chry Cheng    schedule 01.06.2009    source источник


Ответы (2)


Я так думаю - вам понадобятся US_export_policy.jar и local_policy.jar. Нам нужно было сделать то же самое в нашем проекте, и это все исправило.

Я думаю, что ваши ключи, сгенерированные и используемые, должны быть в порядке, иначе. Добавьте эти две банки в jre/lib/security, и это сразу исправит ситуацию.

person Alex Taylor    schedule 01.06.2009
comment
Существуют ли другие поставщики PKCS7, которые не ведут себя подобным образом? Если я не ошибаюсь, это баг, верно? - person Chry Cheng; 01.06.2009
comment
Я склонен согласиться - JVM должна разрешать 128-битную "из коробки", но требует US_export_policy для 256+. Честно говоря, как только я заработал, я не слишком задумывался, почему это так. - person Alex Taylor; 01.06.2009
comment
Боюсь, что в моем случае это невозможно :( Мне это нужно для апплета, и наши пользователи могут не знать (или им не разрешено по закону) обновиться до неограниченной мощности. - person Chry Cheng; 01.06.2009

Похоже, в версии 141 библиотеки BouncyCastle есть ошибка. Когда я обновился до последней версии (143), сработал точно такой же код.

person Chry Cheng    schedule 11.06.2009