{% extends "_layout_de.html" %} {% block title %}Wie elGgamal und AES Encrypting funktionieren{% endblock %} {% block content %}
Die Webseite wird gerade überholt und dieses Dokument kann alte Informationen enthalten
In I2P sind verschiedene Nachrichten verschlüsselt, aber wir möchten niemanden wissen lassen, von wem oder an wen diese gebunden ist, somit k&oouml;nnen wir nicht einfach eine "an" oder "von" Adresse anhängen. Zusätzlich werden Nachrichten nicht in eindeutiger Reihenfolge (oder verlässlich) transportiert, somit k&oennen wir nicht die erste Nachricht elGamal verschlüsseln und alle weiteren mit AES. Die Alternative, alle Nachrichten mit elGamal zu verschlüsseln, geht unter mit der Anzahl der benötigten Nachrichten. Stattdessen nehmen wir jede einzelne Nachricht und testen, ob diese in eine der drei Möglichkeiten passt:
Falls es für uns ElGamal verschlüsselt ist, wird die Nachricht als neue Session behandelt und wird verschlüsselt mittels encryptNewSession(....) in der [ElGamalAESEngine] wie folgend -
Ein initialer ElGamal Block, verschlüsselt wie zuvor:
|_______1_______2_______3_______4_______5_______6_______7_______8 | 32 byte Session Schlüssel | | | | | 32 byte pre-IV (ersten 16 bytes von H(pre-IV) == IV) | | | | | (158 bytes zufällige Daten) | ... | |
Gefolgt von dem Nachfolgendem, AES verschlüsselt wie zuvor, den Session Schlüssel und den IV vom Header nutzend:
|_______1_______2_______3_______4_______5_______6_______7_______8 | # Session Tags| so viele sessionTags (32 byte Zufallszahlen) | ... | | Grösse der Nutzdaten (bytes)|H(Nutzdaten) | | | | | Flag |Nutzdaten | ... | | | Zufallsbytes zum füllen des ganzen AES Blocks (Grösse % 16 == 0) |
Ist das Flag 0x01, wird es vom Session Schlüssel gefolgt, der den alten ersetzt.
Die erfolgreich transportierten Sessiontags werden für eine sinnvolle Zeit (zur Zeit 30 Minuten) gespeichert bis sie gebraucht (und weggeworfen) werden. Sie werden für das Einpacken einer Nachricht ohne vorhergehnden ElGamal Block genutzt. Dabei wird es mit encryptExistingSession(...) in der [ElGamalAESEngine] wie folgend verschlüsselt -
|_______1_______2_______3_______4_______5_______6_______7_______8 | Sessiontag (32 byte Zufallszahl ungenutzt und nicht zuvor | transportiert oder verworfen). Der Sessiontag dient auch als | pre-IV (die ersten 16 Bytes von H(sessionTag) == IV) | |
Gefolgt vom AES verschlüsselten Block wie oben beschrieben (2 byte # Sessiontags, eine Anzahl Sessiontags, Grösse der Nutzdaten, H(Nutzdaten), Flag, Nutzdaten, Zufallsdaten zum füllen).
{% endblock %}