Siri: Hab's noch nicht ganz verstanden

Beitrag lesen

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());  
        }  
  
    }  
  
}