Rsa

zerix

Hausmeister
Moderator
Ich möchte Dateien mit RSA verschlüsseln, dafür nutze ich die Klasse Cipher. TXT-Dateien funktionieren ohne Probleme. Wenn ich andere Dateien verschlüsseln möchte, bekomme ich die nicht richtig entschlüsselt. Weiß jemand woran das liegen kann?
 
Ich bin mir nicht sicher, aber vielleicht ist liegts am ASCII der TXT und binary der restlichen Dateien. Wahrscheinlich kann der Cipher nicht mir binaries umgehen.

Gruß

Romsl
 
ICh steh dann jetzt ein bischen auf dem schlauch. wie könnte ich andere dateien auslesen, damit ich die verschlüsseln kann? hat jemand ne idee :confused:
 
Hier ist dann mal der Quelltext.

Das ist die Klasse zum Testen der Methoden. Da lege ich ein byte-Array zum verschlüsseln an. Da ich jedes byte verschlüssel möchte, besitzt das Array nur ein Feld. Es darf max. nur 117 Felder groß sein, ich weiß aber noch nicht warum.
Das byte-Array darf nur 128 Felder groß sein, dass weiß ich leider auch noch nicht warum.
Code:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

public class RsaTest {

	public static void main(String[] args) throws Exception {
		KeyPair k=KeyPairGenerator.getInstance("RSA").generateKeyPair();			//generiert die Schlüssel die zur Ver- und Entschlüsselung notwendig sind
		
		// verschlüsseln
		FileInputStream fis=new FileInputStream("/home/schirra/movies_451.jpg");
		FileOutputStream fos=new FileOutputStream("/home/schirra/Desktop/test.rsa");
		byte[] encrypt=new byte[1];
		while(fis.read(encrypt)!=-1)
		{
			fos.write(CryptoRSA.encrypt(encrypt,k));
		}
		System.out.println("Verschlüsselt");
		
		
		// entschlüsseln
		FileInputStream in=new FileInputStream("/home/schirra/Desktop/test.rsa");
		FileOutputStream out=new FileOutputStream("/home/schirra/Desktop/test2.jpg");
		byte[] decrypt=new byte[128];
		while(in.read(decrypt)!=-1)
		{
			out.write(CryptoRSA.decrypt(decrypt,k));
		}
		System.out.println("Entschlüsselt");
	}

}


Das hier sind die Methoden:
Code:
import java.security.KeyPair;

import javax.crypto.Cipher;



public class CryptoRSA {



	public static byte[] encrypt(byte[] d, KeyPair keyPair) throws Exception {



		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());

		byte[] encrypt = cipher.doFinal(d);

		return encrypt;

	}



	public static byte[] decrypt(byte[] d, KeyPair keyPair) throws Exception {



		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());

		byte[] decrypt = cipher.doFinal(d);

		return decrypt;

	}

}
 
Hallo!

Das das funktioniert ist mir klar, dass hatte ich in meinen Beispielen zuerst auch verwendet. Was ich aber nicht zum laufen bekommen habe war das ganze in Verbindung mit nem CipherInputStream / CipherOutputStream...

Gruß tom
 
Hallo!

Mein Beispiel dazu sieht ungefähr so aus:
Code:
  package de.tutorials;
  
  import java.io.BufferedInputStream;
  import java.io.BufferedOutputStream;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.security.KeyPair;
  import java.security.KeyPairGenerator;
  
  import javax.crypto.Cipher;
  import javax.crypto.CipherInputStream;
  import javax.crypto.CipherOutputStream;
  
  public class SimpleFileChiffreExample {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) throws Exception {
  		File file = new File("c:/Sonnenuntergang.jpg");
  
  		Cipher cipher = Cipher.getInstance("RSA");
  		KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
  		cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
  
  		BufferedInputStream bufferedInputStream = new BufferedInputStream(
  				new FileInputStream(file));
  
  		File encryptedFile = new File("c:/Sonnenuntergang_enc.jpg");
  
  		CipherOutputStream cipherOutputStream = new CipherOutputStream(
 				new FileOutputStream(encryptedFile), cipher);
  
  		byte[] buffer = new byte[8192];
  		int len = 0;
  		while ((len = bufferedInputStream.read(buffer)) >= 0) {
  			cipherOutputStream.write(buffer, 0, len);
  		}
  
  		cipherOutputStream.close();
  		bufferedInputStream.close();
  
  		cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
  
  		CipherInputStream cipherInputStream = new CipherInputStream(
 				new FileInputStream(encryptedFile), cipher);
  
  		File decryptedFile = new File("c:/Sonnenuntergang_dec.jpg");
  		BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
 				new FileOutputStream(decryptedFile));
  		
  		while ((len = cipherInputStream.read(buffer)) >= 0) {
  			bufferedOutputStream.write(buffer, 0, len);
  		}
  		cipherInputStream.close();
  		bufferedOutputStream.close();
  
  	}
  }

Das merkwürdige an der Sache ist, dass ich das ähnlich in einem anderen Beispiel hinbekommen habe: http://www.tutorials.de/forum/showpost.php?p=1103148&postcount=14

Gruß Tom
 
Zurück