EnvelopedData z PKCS#7

0

Witam
Czy ktoś używał może struktury EnvelopedData z PKCS#7 do opakowywania danych?
Chcę zaszyfrować dane 3DES-em i opakować je w EnvelopedData z PKCS#7. Będę wdzięczny za jakikolwiek przykładowy kod bądź informacje jak się do tego zabrać. Szukałem na googlach ale nic pomocnego nie wyczytałem :/

Pozdrawiam

0

Użyłem tej klasy którą mi podałeś (dzięki), ale napotkałem następny problem :/
Jak przekonwertować moją wiadomość (byte[]) do formatu, który przyjmuje metoda generate?
Mój kod:

public static void main(String[] args) throws IllegalArgumentException, Exception {
		java.security.Security.addProvider ( new BouncyCastleProvider (  )  ) ;
    	CMSEnvelopedDataGenerator  fact = new CMSEnvelopedDataGenerator();
    	
    	fact.addKeyTransRecipient(getCert());
    	
		CMSEnvelopedData         data = fact.generate(getCMSProcessable(), fact.DES_EDE3_CBC, "BC");
		System.out.println(data);

		
		
	}

	private static CMSProcessable getCMSPrace() {
		CMSProcessable mess=null;
		
		return mess;
	}

	private static X509Certificate getCert() throws Exception {
		 InputStream is = new FileInputStream("/home/slisiecki/temp/nowecert/bpi_cert_20090525.pem");

			CertificateFactory cf;
			X509Certificate cert;
			
			cf = CertificateFactory.getInstance("X.509");		
			cert = (X509Certificate) cf.generateCertificate(is);
			is.close();
		return cert;
	}

}



0

Bo się pogniewamy :/ w dokumentacji stoi, że jest metoda write(OutputStream). Masz klasę OutputStreamWriter.

0

:-) nie chce się gniewać.
Przerobiłem troszkę mój kod i teraz wygląga następująco:

public byte[] generateEnv  (byte[] file) throws Exception {
		CMSEnvelopedDataGenerator dataGenerator =new CMSEnvelopedDataGenerator();
		   
		dataGenerator.addKeyTransRecipient(getCert());
	    
	        CMSProcessableByteArray byteArray = new CMSProcessableByteArray(file );
	    
	        CMSEnvelopedData envelopedData = null;
	    
	        envelopedData = dataGenerator.generate(byteArray, CMSEnvelopedDataGenerator.DES_EDE3_CBC, "BC");
	  
	        byte[] result = envelopedData.getEncoded();
	    
	        System.out.println(new String(result));
		
	    System.out.println(result);
		
		
		return result;
	}

Po wywołaniu metody generateEnv() wywala mi błąd:
Exception in thread "main" org.bouncycastle.cms.CMSException: key invalid in message.
at org.bouncycastle.cms.CMSEnvelopedDataGenerator.generate(Unknown Source)
at org.bouncycastle.cms.CMSEnvelopedDataGenerator.generate(Unknown Source)
at ccc.Generate.generateEnv(Generate.java:91)
at ccc.wysyłka.main(wysyłka.java:40)
Caused by: java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
... 4 more

Nie za bardzo potrafię sobie wytłumaczyć o co chodzi. Tzn. rozumiem, że jest nieprawidłowy klucz i jego rozmiar.
Rozumiem, że klucz jest wyciągany z certyfikatu, który zapodałem. Certyfikat jest w formacie .pem, więc znajduje się w nim klucz publiczny, natomiast prywatnego nie ma, a chyba gdzieś czytałem, że do opakowania w EnvelopedData potrzebny jest także klucz prywatny. Ale z drugiej strony wtedy metoda nie przyjmowałaby jako parametru certyfikatu typu X509Certificate?

1 użytkowników online, w tym zalogowanych: 0, gości: 1