Input/Output RSA-Verschlüsslung mit CipherOutputStream

g0dm0d

Mitglied
Hi Leute,

ich bin möchte Objekte mithilfe von RSA ver-/entschlüsseln.
Eine
Code:
Message
ist ein normales, serialisierbares Objekt, und eine
Code:
EncryptedMessage extends Message
und enthält einen
Code:
byte[]
. Das Serialisieren des Objektes selbst klappt und ich bekomme circa 500 Bytes raus, aber sobald ich es durch den
Code:
CipherOutputStream
geschrieben habe bekomme ich 0 bytes.
Hab ich da was vergessen?

Java:
	/**
	 * 
	 */
	private static final String ALGORITHM = "RSA";


	/**
	 * @param pubkey
	 * @param m
	 * @return
	 */
	public EncryptedMessage encrypt(PublicKey pubkey, Message m) {
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM);
			cipher.init(Cipher.ENCRYPT_MODE, pubkey);

			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			CipherOutputStream cos = new CipherOutputStream(bos, cipher);
			ObjectOutputStream oos = new ObjectOutputStream(cos);
			oos.writeObject(m);
			oos.flush();

			byte[] encryptedBytes = bos.toByteArray();
			return new EncryptedMessage(encryptedBytes);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}

	/**
	 * @param privkey
	 * @param m
	 * @return
	 */
	public Message decrypt(PrivateKey privkey, EncryptedMessage m) {
		if (m.getContent() != null && m.getContent().length > 0) {
			try {
				Cipher cipher = Cipher.getInstance(ALGORITHM);
				cipher.init(Cipher.DECRYPT_MODE, privkey);

				ByteArrayInputStream bin = new ByteArrayInputStream(
						m.getContent());
				CipherInputStream cin = new CipherInputStream(bin, cipher);
				ObjectInputStream in = new ObjectInputStream(cin);

				return (Message) in.readObject();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		return null;
	}
}

Vielen Dank :)
 

g0dm0d

Mitglied
Hi HoaX,

selbst wenn ich der Reihe nach den
Code:
oos
, den
Code:
cos
und dann den
Code:
bos
close ändert sich nichts. Der Inhalt bleibt weiterhin null, selbst wenn ich vor dem closen noch einmal flushe.
Noch ne Idee? :)
 

Dekker

Bekanntes Mitglied
Ich bin mir nicht sicher, aber wird zufällig ne Exception geworfen? Wenn ich mich recht entsinne kann man nur einen Block an Daten mit dem RSA von Sun verschlüsseln. Glaube maximum war 256Byte oder so.

Edit:

Probiers mal mit ner kleineren Message.
 
Zuletzt bearbeitet:

g0dm0d

Mitglied
Hi Dekker,

ja die Sache war die, ich hab vorher versucht den Bytearray direkt zu verschlüsseln, und da fliegt eine
Code:
IllegalBlockSizeException
(oder so ähnlich), die mir sagt das ich nicht mehr als 117 Bytes verschlüsseln kann. Hab dann irgendwo gelesen das es für Verschlüsselung eben den
Code:
CipherOutputStream
gibt und es damit versucht. Eine Exception fliegt dabei nicht, die wird wahrscheinlich intern abgehandelt :/

Kennst du vielleicht eine gute Alternative zu RSA zum Verschlüsseln mit Public/Private Key? :)

Danke

Edit:
Mit einer 256-Byte-Nachricht kommt er klar. Liegt also anscheinend wirklich an der Größe.
Ich verusch jetz mal das serialisierte Objekt in kleine Bytestückchen aufzuteilen und dann zu verschlüsseln ;)
 
Zuletzt bearbeitet:

Dekker

Bekanntes Mitglied
Hm, was willst du den genau machen? RSA wird normalerweise vor allem bei Hybridverfahren heute eingesetzt. D.h. ich handle mittels RSA einen gemeinsamen Schlüssel aus und der Rest meiner Kommunikation verläuft dann mittels symetrischer Verschlüsselung (wobei natürlich nach einer Weile, meißt geht man hier nach Anzahl gesendeter Nachrichten, der Schlüssel neu ausgehandelt wird). Grund dafür ist, das symetrische Verschlüsselung effizienter zu implementieren sind.
 

g0dm0d

Mitglied
Ich möchte eine sichere Client-Server-Verbindung gewährleisten. Deshalb wird nach Aufbau der Verbindung auf beiden Seiten ein Schlüsselpaar generiert, und der Client sendet seinen Public Key unverschlüsselt an den Server. Der Server sendet nun seinen Public Key bereits verschlüsselt zurück an den Client.

Deshalb brauch ich eine möglichst effiziente Möglichkeit für eine asymmetrische Verschlüsselung, Verbindungsaufbau und Schlüsselaustausch funktioniert soweit bereits.

Was habe ich denn für Alternativen? :)
 

Dekker

Bekanntes Mitglied
Ich möchte eine sichere Client-Server-Verbindung gewährleisten. Deshalb wird nach Aufbau der Verbindung auf beiden Seiten ein Schlüsselpaar generiert, und der Client sendet seinen Public Key unverschlüsselt an.

Was hat er damit gewonnen? Den public Key zu verschlüsseln macht keinen Sinn, denn der ist wie gesagt öffentlich. Öffentliche Schlüssel kann jede rhaben der sie will.

Muß leider erstmal los, aber schau dir beispielsweise Hybridverfahren an. Diese verwenden die RSA Verschlüsselung um einen symetrischen Schlüssel zu erzeugen und benutzen danach nur noch symetrische Verschlüsselung. Für dich würde das beispielsweise bedeuten, dass beide (Server und client) jeweils ein Secret wählen, das sie austauschen. Danach wird mit hilfe dieser "Secrets" der symetrische Schlüssel berechnet.
 
I

irgendjemand2

Gast
also RSA als stream-cipher zu nutzen ist 1) zu aufwändig und 2) zu schwierig ...

in der praxis wird es so gemacht

der client will eine sichere verbindung aufbauen
server sendet ihm sein public-key
client generiert session-key *meist AES*
client verschlüsselt session-key mit rsa-public vom server und sendet diesen zurück
server entschlüsselt session-key mit rsa-private
beide schalten um auf AES mit dem ausgetauschten key

das ist jetzt mal etwas vereinfacht ... in wirklichkeit läuft da ein bisschen mehr ... aber das ist es so im groben und ganzen ...

und wenn du das auch so nach java umsetzt kommt da etwas sehr kompaktes herraus ..

zum Cipher*Stream : ich würde dir davon abraten ... lieber mit normalen *Streams arbeiten und die daten davor / danach ver/entschlüsseln ..

ich hab code dazu da *auch wenn der nicht ganz sauber ist .. aber läuft*
könnt ich dir mal geben ... gesamt größe dieser "lib" : compiled ca 4kb aus 10kb source *mit vielen comments*
 

Jackcarver12

Mitglied
Hi Leute,

ich bin möchte Objekte mithilfe von RSA ver-/entschlüsseln.
Eine
Code:
Message
ist ein normales, serialisierbares Objekt, und eine
Code:
EncryptedMessage extends Message
und enthält einen
Code:
byte[]
. Das Serialisieren des Objektes selbst klappt und ich bekomme circa 500 Bytes raus, aber sobald ich es durch den
Code:
CipherOutputStream
geschrieben habe bekomme ich 0 bytes.
Hab ich da was vergessen?

Java:
    /**
     *
     */
    private static final String ALGORITHM = "RSA";


    /**
     * @param pubkey
     * @param m
     * @return
     */
    public EncryptedMessage encrypt(PublicKey pubkey, Message m) {
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, pubkey);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            CipherOutputStream cos = new CipherOutputStream(bos, cipher);
            ObjectOutputStream oos = new ObjectOutputStream(cos);
            oos.writeObject(m);
            oos.flush();

            byte[] encryptedBytes = bos.toByteArray();
            return new EncryptedMessage(encryptedBytes);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * @param privkey
     * @param m
     * @return
     */
    public Message decrypt(PrivateKey privkey, EncryptedMessage m) {
        if (m.getContent() != null && m.getContent().length > 0) {
            try {
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, privkey);

                ByteArrayInputStream bin = new ByteArrayInputStream(
                        m.getContent());
                CipherInputStream cin = new CipherInputStream(bin, cipher);
                ObjectInputStream in = new ObjectInputStream(cin);

                return (Message) in.readObject();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }
}

Vielen Dank :)
hey kannst du mir vielleicht netterweise mehr zu der Klasse EncryptedMessage sagen?
Ich will deinen code verstehen!
Wie hast du es am Ende gelöst. Aus der verlinkten Webseite werde ich nicht schlau!
LG
 

mrBrown

Super-Moderator
Mitarbeiter
hey kannst du mir vielleicht netterweise mehr zu der Klasse EncryptedMessage sagen?
Ich will deinen code verstehen!
Wie hast du es am Ende gelöst. Aus der verlinkten Webseite werde ich nicht schlau!
LG
Der Post ist von 2012, und der Code funktioniert offensichtlich nicht, sonst gäbs ja keine Frage dazu...

Wenn du eine eigene Frage hast, öffne doch bitte einen eigenen Thread.
 

Ähnliche Java Themen

Neue Themen


Oben