Schlüsselworte RSA Verschlüsselung implementieren

Fbgng

Mitglied
Hallo,

ich möchte zwei Klassen implementieren, eine Encrypt die, auf eine Datei angewandt, diese verschlüsselt und einen Schlüssel speichert, die andere Decrypt, die die erstellte Datei wieder entschlüsselt. Ich habe wirklich viel im Internet recherchiert (und auch viel gefunden..) aber bin einfach nicht dahinter gekommen, wo bei mir der Fehler liegt. Evtl sieht das ja jemand hier auf einen Blick und kann mir einen Tipp geben..

Java:
package cifrar;

import java.io.*;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

import sun.security.rsa.RSAKeyFactory;
import sun.security.rsa.RSAKeyPairGenerator;

public class RSAEncrypt {

	private KeyPair key_pair = null;
	private Cipher algo = null;

	public void generateKey() throws NoSuchAlgorithmException {
		KeyPairGenerator genKey = KeyPairGenerator.getInstance("RSA");
        genKey.initialize(512);
        key_pair = genKey.generateKeyPair();
	}

	public void saveKey() throws FileNotFoundException, IOException {
		ObjectOutputStream filekey = new ObjectOutputStream(new FileOutputStream("./ficheros_prueba/"+"RSAClavePrivate.ser"));
		filekey.writeObject(key_pair.getPrivate());
		filekey.close();	
		ObjectOutputStream keyPublic = new ObjectOutputStream(new FileOutputStream("./ficheros_prueba/"+"RSAClavePublic.ser"));
		keyPublic.writeObject(key_pair.getPublic());
		keyPublic.close();
	}

	public void setAlgorithm() throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException {
		Cipher algo = Cipher.getInstance("RSA");
		algo.init(Cipher.ENCRYPT_MODE, this.key_pair.getPublic());
		this.algo = algo;
	}

	public Cipher getAlgorithm() {
		return this.algo;
	}

	public KeyPair getKey() {
		return this.key_pair;
	}
}

Und die Datei zum entschlüsseln:

Java:
package descifrar;

import java.io.*;
import java.security.*;

import javax.crypto.*;

public class RSADecrypt {

	
	private KeyPair key_pair = null;
	private Cipher algo = null;

	
	public void readKey() throws IOException, ClassNotFoundException {
		
		
		FileInputStream fich = new FileInputStream("./ficheros_prueba/"+"RSAClavePrivate.ser");
		ObjectInputStream fichread = new ObjectInputStream(fich); 
		FileInputStream fich2 = new FileInputStream("./ficheros_prueba/"+"RSAClavePublic.ser");
		ObjectInputStream fichread2 = new ObjectInputStream(fich2); 
		
		
		PrivateKey key = (PrivateKey)fichread.readObject();
		PublicKey keyPublic = (PublicKey)fichread2.readObject();
		this.key_pair = new KeyPair(keyPublic, key);
		fich.close();
		
	}

	 
	public void setAlgorithm() throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException {
		Cipher algo = Cipher.getInstance("RSA");
		algo.init(Cipher.DECRYPT_MODE, this.key_pair.getPrivate());
		
		this.algo = algo;
	}

	public Cipher getAlgorithm() {
		return this.algo;
	}

}

Bin über jeden Tip sehr dankbar!
 

Fbgng

Mitglied
Der Aufruf ist schon vorgegeben, der sieht so aus:

Java:
RSAEncrypt rsa = new RSAEncrypt(); 
		rsa.generateKey(); 
		rsa.saveKey(); 
		rsa.setAlgorithm(); 
		BufferedInputStream input = new BufferedInputStream(
				new FileInputStream("./ficheros_prueba/" + nombre_fich_ext)); 
char b = ' '; 
		b = (char) input.read(); 
		while (b != (char) -1) 
		{
			salida.write(b); 
			b = (char) input.read(); r
		}

		input.close(); 
		salida.close();

Ich vermute dass ich irgendwo in der Encrypt Klasse schon einen grundlegenen Fehler habe, ein Key wird zwar erstellt und auch eine Datei angelegt, diese ist allerdings leer...
 

Sen-Mithrarin

Gesperrter Benutzer
dein fehler ist der grundgedanke

du willst RSA selbst direkt nutzen ... das macht man nicht und kostet auch extrem viele resourcen
zu dem kann man mit RSA nur nachrichten verarbeiten die maximal so lang sind wie der schlüssel ... in deinem beispiel also maximal 512bits

RSA ist eine recht aufwändige operation : potenzieren und modulus
beides kostet auch mit modernen rechenwerken extrem viele zyklen ... und muss im worst-case auf die grund-operation einer jeden ALU runtergebrochen werden : addition (man kann alles mit reiner addition lösen ... kostet dafür halt nur sehr viel mehr rechenzyklen)

RSA selbst nutzt man in der regel in einer hybriden variante zusammen mit einer strom-chriffre ... wie z.b. AES
man erzeugt einen symetrischen schlüssel und sichert diesen dann mit RSA ... man nutzt RSA also nur zum austausch des symetrischen schlüssels mit hilfe dessen dann mit der strom-chiffre die daten sehr viel schneller und besser verschlüsselt und übertragen werden können (auf grund der einfachereren rechen-operationen)

auch sind deine klassen irgendwie sinnlos
deine encrypt-klasse erzeugt lediglich den schlüssel und serialisiert diesen ... hier schon mal : man nutzt RSA-schlüssel in der regel nur einmal ... es macht also höchstens sinn den privaten key zusammen mit dem "geheimnis" zu speichern welches mit dem public key verschlüsselt wurde ... wobei auch diese informationen eigentlich zu trennen sind

klar gibt es von dieser regel auch eine ausnahme : zertifikate
da es darum geht mit einem bekannten schlüssel seine echtheit zu garantieren wird dieser normalerweise einmal erzeugt und dann immer wieder für zufällig erzeugte session-schlüssel verwendet

deine decrypt-klasse liest dann das gespeicherte keypair wieder ein (wie gesagt : hier ist der public key eigentlich überflüssig da er nicht weiter benötigt wird) und stellt dann ein Cipher-objekt bereit


außerdem solltest du dir das hier unbedingt mal reinziehen : Code Conventions for the Java Programming Language


die aufgabe deiner klassen sollte es sein nach außen hin nur eine methode anzubieten die halt die arbeit übernimmt ... und nicht nur ein Cipher bereitstellt und die restliche arbeit dann der implementierung zu überlassen
dann braucht man auch keine extra-klassen



ich würde dir erstmal empfehlen dich über RSA und allgemein a-symetrischer sowie hybrider verschlüsselung (in diesem zusammenhang am besten mit AES) zu befassen bevor du hier irgendwie weiter machst ... denn egal wie lange man schrott bearbeitet ... es bleibt schrott
 

Fbgng

Mitglied
Hallo Sen-Mithrarin,

danke auch für deine Antwort und deine Erläuterungen zur Verwendung von RSA. Das wusste ich zuvor nicht. Allerdings handelt es sich hierbei um eine Übungsaufgabe, die Klassen inklusive leerer Methoden waren vorgegeben, deswegen ist für mich die Diskussion über Sinn oder Unsinn selbiger irrelevant..

Muss ich die mit dem Public Key encryptete Datei speichern und dazu den Private Key, und mit der Decrypt Klasse die Datei dann mit dem Private Key entschlüsseln? Der Public Key wird nur zum verschlüsseln verwendet, richtig?
 

Sen-Mithrarin

Gesperrter Benutzer
gib uns doch mal als hilfe alles was vorgegeben ist damit wir gucken können in wie weit es sinn macht und was man machen könnte ... und was vielleicht erwartet wird

grundsätzlich : RSA ist eine sog. a-symetrische falltür operation
bedeutet : der eine weg ist relativ einfach ... die umkehrung jedoch nur mit hilfe des "geheimnis" lösbar
RSA beruht auf dem problem das man große zahlen nur schwer wieder faktorisieren kann
darum ist es bei RSA auch so wichtig möglichst lange und korrekte primzahlen (P und Q) als basis zu wählen

weiterhin ist RSA keine sog. strom-/block-chiffre ... kann also nur nachrichten verarbeiten die maximal so lang sind wie der schlüssel selbst

als ergebnis bekommt man letzten endes zwei schlüssel-paare

den öffentlichen schlüssel, bestehend aus dem öffentlichen exponenten und dem modulus
und den privaten schlüssel, bestehend aus dem privaten exponenten und dem modulus

der modulus ist für ver- und ent-schlüsselung gleich und einfach das produkt der multiplikation der beiden primzahlen P und Q

der öffentliche exponent wird meist als 65537 gewählt, kann aber auch davon abweichen
der private exponent wird dann mit einer mathematischen formel (die ich erlich gesagt so auch noch nicht ganz verstanden habe) errechnet wofür man aber kenntnis der primzahlen haben muss



die sicherheit eines RSA-schlüssels beruht also nur darauf das man einen möglichst großen modulus wählt der möglichst schwer zu faktorisieren ist ... also wieder in seine beiden primzahlen zerlegt werden kann




das nur noch mal so zu RSA


zu deiner "lösung"

ich würde nicht nach ver- und ent-schlüsseln trennen, sondern nach aufgaben

also einer klasse die für das erzeugen, speichern und laden der schlüssel verantwortlich ist ... und einer klasse in der die "magie" passiert

wobei ich bei ersterem wie gesagt auf den public-key verzichten würde da dieser eh nur einmal genutzt wird

ob nun der private-key als extra file gespeichert wird oder sinnfreier weise direkt an den anfang oder das ende der verschlüsselten datei gepakt wird spielt hier für die sicherheit keine rolle

interessant wäre es wenn man wie gesagt mit AES arbeiten würde ...
dann könnte man z.b. einen AES-key erzeugen ... damit das file verschlüsseln ... letztlich den AES-key mit seinem RSA-public verschlüsseln und mit der datei zusamen speichern ... man muss sich dann nur einen plan machen wie man den RSA-private sichert ... z.b. auf einem anderen laufwerk

"sicher" wäre es halt nur so lange der private exponent geheim bleiben würde ...

leider kann man RSA nicht wie z.b. AES aus einem PBE (PasswordBasedEncryption) erzeugen ... da man sonst die primes in abhängigkeit des inputs wählen müsste ... was die mögliche anzahl verschiedener schlüssel stark einschränkt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
X Verschlüsselung Allgemeine Java-Themen 18
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
R Verschlüsselung falsch Allgemeine Java-Themen 3
R Verschlüsselung funktioniert nicht Allgemeine Java-Themen 5
J Passwort Verschlüsselung hash Allgemeine Java-Themen 2
D AES Verschlüsselung / Wirklich AES 128-Bit? Allgemeine Java-Themen 4
I Best Practice Verschlüsselung mit SALT Allgemeine Java-Themen 4
A Mehrfache XOR Verschlüsselung Allgemeine Java-Themen 11
Thallius Moderne sichere synchrone Verschlüsselung mit Java? Allgemeine Java-Themen 3
Ananaskirsche Verschlüsselung mit AES Allgemeine Java-Themen 4
E Verschlüsselung Allgemeine Java-Themen 4
S Key (für AES-Verschlüsselung) aus String Allgemeine Java-Themen 4
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
K Problem mit Salted - Verschlüsselung Allgemeine Java-Themen 4
Z Java E-Mail Client mit End-to-End-Verschlüsselung Allgemeine Java-Themen 4
J Verschlüsselung von Text? Allgemeine Java-Themen 2
K Vigenere- Verschlüsselung Allgemeine Java-Themen 13
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
T AES-Verschlüsselung mit eigenem 256 Bit Schlüssel Allgemeine Java-Themen 12
DStrohma Verschlüsselung: SALT aus Passwort generieren? Allgemeine Java-Themen 3
G AES Verschlüsselung nur bis 63 Zeichen Länge Allgemeine Java-Themen 2
M Verschlüsselung mit Cipher Allgemeine Java-Themen 5
B XOR Verschlüsselung Allgemeine Java-Themen 7
S Framework für symetrische und asymetrische Verschlüsselung Allgemeine Java-Themen 3
lumo Verschlüsselung Allgemeine Java-Themen 2
H Verschlüsselung mit Blowfish Allgemeine Java-Themen 14
C Interpreter-Fehler AES verschlüsselung mit MD5 key Allgemeine Java-Themen 6
S AES Verschlüsselung - File Headers korrupt Allgemeine Java-Themen 10
A Datei, UTF-8, NTRU-Verschlüsselung Allgemeine Java-Themen 3
B "Verschlüsselung" mit Passwort (XOR bzw. Modulo) Allgemeine Java-Themen 7
B String Verschlüsselung Allgemeine Java-Themen 6
M Verschlüsselung anwenden Allgemeine Java-Themen 6
J Verschlüsselung Allgemeine Java-Themen 22
T MD5 Verschlüsselung Nullen fehlen? Allgemeine Java-Themen 2
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
C javamail signatur und verschlüsselung Allgemeine Java-Themen 2
R 128 Bit Verschlüsselung/Entschlüsselung in Java? Allgemeine Java-Themen 6
F RSA-Verschlüsselung Allgemeine Java-Themen 4
S Verschlüsselung in Java Allgemeine Java-Themen 2
G Interessant! Verschlüsselung in Java, Charset in der JVM? Allgemeine Java-Themen 14
D Eigener Key bei AES Verschlüsselung Allgemeine Java-Themen 4
T Verschlüsselung von Dateien Allgemeine Java-Themen 8
S Verschlüsselung - IllegalBlockSizeException Allgemeine Java-Themen 3
G Problem mit RSA Verschlüsselung bei .net und Java Allgemeine Java-Themen 1
D Caesar und Vigenère Verschlüsselung Allgemeine Java-Themen 2
alexpetri Verschlüsselung Allgemeine Java-Themen 13
@ [Sicherheit] Speicherung von Keys für Verschlüsselung Allgemeine Java-Themen 4
P Verschlüsselung in PHP -> Entschlüsselung in Java Allgemeine Java-Themen 2
Lazybone Caeser Verschlüsselung Allgemeine Java-Themen 6
S Verschlüsselung mit Cipher Allgemeine Java-Themen 8
S Verschlüsselung Allgemeine Java-Themen 15
J Problem mit Dateien/XOR-Verschlüsselung Allgemeine Java-Themen 5
G RSA-Verschlüsselung Allgemeine Java-Themen 1
P HMACMD5- Verschlüsselung entschlüsseln Allgemeine Java-Themen 2
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J Probleme bei XOR verschlüsselung ! Allgemeine Java-Themen 5
G Verschlüsselung in Java Allgemeine Java-Themen 9
M RSA Verschlüsselung Allgemeine Java-Themen 7
J Verschlüsselung von Daten Allgemeine Java-Themen 21
L Buchungssystem implementieren Allgemeine Java-Themen 2
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
MiMa Was sollte man ins JavaDoc implementieren?? Allgemeine Java-Themen 17
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
L Template Engine entwerfen und implementieren Allgemeine Java-Themen 4
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
P BruteForce Ansatz implementieren Allgemeine Java-Themen 32
A Breitensuche mit Hop-Distanzen in Java - Wie implementieren? Allgemeine Java-Themen 4
M Maven Deutsche Post API implementieren Allgemeine Java-Themen 2
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
K Geschätze Zeit implementieren Allgemeine Java-Themen 14
B Live Search implementieren Allgemeine Java-Themen 4
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
T Generisch implementieren Allgemeine Java-Themen 31
J Wie implementieren, Frge an die Erfahrenen... Allgemeine Java-Themen 7
M Interface einer Library implementieren Allgemeine Java-Themen 3
H Copy Paste implementieren ausserhalb des Programms? Allgemeine Java-Themen 2
D Aufgabe: Schnittstelle und Proxy implementieren Allgemeine Java-Themen 2
B Best Practice HTML Output Optimal implementieren Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
DStrohma In abstrakter Klasse Konstruktor von Instanz implementieren Allgemeine Java-Themen 11
X Modalität von JDialog nachträglich in JFrame implementieren? Allgemeine Java-Themen 8
O Plugin perfomrant implementieren Allgemeine Java-Themen 12
P InterfaceMethoden nicht implementieren Allgemeine Java-Themen 5
C Hilfe bei Adressbuch-Programmierung, wie am Besten mit JList implementieren Allgemeine Java-Themen 2
A RandomAccessFile - "insert" implementieren? Allgemeine Java-Themen 4
nrg Wie würdet ihr eine "Dauerschnittstelle" implementieren? Allgemeine Java-Themen 5
T Von JComponent erben und Set implementieren Allgemeine Java-Themen 2
D Wozu runnable implementieren? Allgemeine Java-Themen 3
D PriorityQueue selbst implementieren Allgemeine Java-Themen 15
E Wie Assoziationen implementieren in Java Allgemeine Java-Themen 22
B mathematische Formeln, umformungen nicht einzeln implementieren Allgemeine Java-Themen 6
J Undo auf eine ArrayList implementieren Allgemeine Java-Themen 3
deetee ListIterator implementieren Allgemeine Java-Themen 3
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
B Generisches Singleton implementieren Allgemeine Java-Themen 12
T Interface "on-the-fly" implementieren? Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
G Interface mehrfach implementieren Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben