2009-06-01 6 views
4

ここで暗号化初心者...ここでは、以下のコードでBouncyCastleを使用して128ビットの暗号化を試みています。BouncyCastleで「強力な」JREポリシーファイルを使用する

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ビット暗号化を行うには、無制限の強度ポリシーファイルをインストールする必要がありますか?

助けを非常に感謝します。

ありがとうございます!

答えて

3

BouncyCastleライブラリのバージョン141にバグがあるようです。最新バージョン(143)にアップグレードすると、まったく同じコードが機能しました。

2

私はそう信じています - あなたはUS_export_policy.jarとlocal_policy.jarが必要です。プロジェクトでも同じことをする必要がありました。これで解決しました。

あなたの鍵は生成され、使用されているといいと思います。これらの2つのjarをjre/lib/securityに追加します。

+0

このように動作しない他のPKCS7プロバイダがありますか?私が間違っていなければ、これはバグです、正しい? –

+1

私は同意する傾向があります - JVMはすぐに128ビットを許可する必要がありますが、256以上の場合はUS_export_policyが必要です。正直言って、いったん動作させてしまえば、なぜこれが当てはまるのかあまり考えなかった。 – Chaos

+0

私の場合は恐れることはできません:(私はアプレットのために必要であり、ユーザーは無限の強さにアップグレードすることを知っている(または合法的に許可されている)かもしれません。 –

関連する問題