Hallo,
ich hab unten stehendes Beispiel gefunden, habe aber das Gesamtkonzept nicht ganz verstanden...
1. erzeugt wird wohl ein KeyPair, das zwingend zusammengehört.
2. Mit dem publicKey wird verschlüsselt, mit dem privateKey entschlüsselt.
3. Wenn das Dokument verschlüsselt ist, kann es also nur noch mit dem privateKey entschlüsselt werden.
Wenn man jetzt sharen will, was nützt es dann, dem empfänger den publicKey zukommen zulassen? Damit kann er nichts anfangen. Ist der publicKey einaml verwendet, dann ist er (in unten stehendem Beispiel) doch nutzlos!
Under der privateKey sollte ja private bleiben...
Viele Grüße
Siri
public class EncryptionTest2 {
/**
* Zwischengespeichertes Schluesselpaar
*/
private static KeyPair keyPair;
/**
* Erzeugt ein RSA Schluesselpaar
*/
public static KeyPair getKeyPair() throws Exception {
if (keyPair == null) {
KeyPairGenerator kpg;
try {
kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
keyPair = kpg.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
throw new Exception( "Fehler beim Erzeugen des Schluesselpaars: " + e.getMessage());
}
}
return keyPair;
}
/**
* Wrapped einen OutputStream in einen verschlüsselnden CipherOutputStream
*/
public static OutputStream encryptOutputStream(OutputStream os) throws Exception {
try {
// temporaeren AES Key erzeugen
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom();
keygen.init(random);
SecretKey key = keygen.generateKey();
// mit RSA verschluesseln und an Empfaenger senden
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, getKeyPair().getPublic());
byte[] encryptedAesKey = cipher.wrap(key);
os.write(encryptedAesKey);
// eigentliche Nachricht mit AES verschluesseln
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
os = new CipherOutputStream(os, cipher);
} catch (Exception e) {
throw new Exception("Fehler beim Verschluesseln: " + e.getMessage());
}
return os;
}
/**
* Liest den Inhalt einer Datei aus.
*/
public static String readFile(String file) throws Exception {
InputStream is = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader isrb = new BufferedReader(isr);
return isrb.readLine();
}
/**
* Wrapped einen InputStream in einen entschlüsselnden CipherInputStream
*/
public static InputStream decryptInputStream(InputStream is) throws Exception {
try {
// AES Key lesen
byte[] wrappedKey = new byte[256];
is.read(wrappedKey, 0, 256);
// AES Key mit RSA entschluesseln
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.UNWRAP_MODE, getKeyPair().getPrivate());
Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
// Daten mit AES entschluesseln
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
is = new CipherInputStream(is, cipher);
} catch (Exception e) {
throw new Exception("Fehler beim Entschluesseln: " + e.getMessage());
}
return is;
}
/**
* Beispiel für Verschlüsselung mit CipherInputStream und CipherOutputStream
*/
public static void main(String... args) {
try {
String file = "c:/temp/test.txt";
String plain = "Blubb Bla Blubb";
System.out.println("Klartext: " + plain);
// verschlüsseln
OutputStream os = new FileOutputStream(file);
os = encryptOutputStream(os);
OutputStreamWriter osw = new OutputStreamWriter(os);
osw.write(plain);
osw.close();
// verschlüsselten Text ausgeben
String secret = readFile(file);
System.out.println("verschluesselter Text: " + secret);
// entschlüsseln
InputStream is = new FileInputStream(file);
is = decryptInputStream(is);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader isrb = new BufferedReader(isr);
String decryptedPlain = isrb.readLine();
isrb.close();
System.out.println("entschluesselter Text: " + decryptedPlain);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}