سؤال

تشفير Newbie هنا ... أحاول أن أفعل تشفير 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 والنسخة البونية التي استخدمتها 141.

هل أفعل ذلك بالطريقة الصحيحة؟ هل ما زلت بحاجة إلى تثبيت ملفات سياسة القوة غير المحدودة للقيام تشفير 128 بت؟

المساعدة موضع تقدير كبير.

شكرا!

هل كانت مفيدة؟

المحلول 2

يبدو أن الإصدار 141 من مكتبة Bouncycastle لديه خطأ. عندما قمت بالترقية إلى أحدث إصدار (143)، عمل نفس الكود بالضبط.

نصائح أخرى

أعتقد ذلك - ستحتاج إلى us_export_policy.jar و local_policy.jar. نحن بحاجة إلى القيام بنفس الشيء في مشروعنا، وهذا إصلاحه.

أعتقد أن مفاتيحك كما هو موضح وتستخدم يجب أن تكون على ما يرام، وإلا. أضف هذين الجرارين إلى JRE / LIB / Security، وهذا يجب إصلاحك مباشرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top