tools / des
des/
Symmetrische DES-Verschlüsselung und -Entschlüsselung, um Altsysteme anzubinden, die noch DES verwenden. Modus, Padding, Format von Schlüssel und IV sowie Zeichensatz sind frei wählbar, die Ergebnisse stimmen mit Java und CryptoJS überein, und dein Schlüssel verlässt den Browser nie.
Klartext
Chiffretext
Verlauf
Nach jeder erfolgreichen Ver- oder Entschlüsselung wird automatisch ein Eintrag gespeichert. Die letzten 20 bleiben erhalten, ausschließlich im Browser dieses Geräts. Schlüssel werden nie gespeichert, IVs und entschlüsselter Klartext aber schon – leere den Verlauf daher, wenn du an einem öffentlichen Computer fertig bist.
AES, DES und RSA: Was sie sind und worin sie sich unterscheiden
AES und DES sind symmetrische Verfahren: Zum Ver- und Entschlüsseln dient derselbe Schlüssel, so wie ein Schlüssel eine Tür sowohl auf- als auch abschließt. Sie sind schnell und eignen sich für große Datenmengen; schwierig ist nur, den Schlüssel sicher zur Gegenseite zu bringen.
DES ist ein alter Standard aus den 1970er-Jahren mit nur 56 Bit effektiver Schlüssellänge. Mit spezieller Hardware oder Rechner-Clustern lässt er sich heute per Brute-Force knacken und taugt deshalb nur noch zur Anbindung von Altsystemen, die ihn weiter verwenden. AES hat DES als Standard abgelöst. Es nutzt Schlüssel mit 128, 192 oder 256 Bit, ist derzeit praktisch nicht angreifbar und die erste Wahl zum Verschlüsseln von Daten.
RSA ist asymmetrisch: Es gibt ein Schlüsselpaar. Den öffentlichen Schlüssel kann man an jeden weitergeben, er dient zum Verschlüsseln; den privaten Schlüssel behältst du für dich, mit ihm wird entschlüsselt – wie bei einem Briefkasten, in den jeder Briefe einwerfen kann, den aber nur du aufschließen kannst. Man muss vorab keinen gemeinsamen Schlüssel vereinbaren, dafür ist RSA langsam und kann pro Durchgang nur einige hundert Byte verschlüsseln. In der Praxis kombiniert man beides: RSA verschlüsselt einen zufällig erzeugten AES-Schlüssel für die Gegenseite, und AES verschlüsselt die eigentlichen Daten.
Was ist ein Verschlüsselungsmodus, und welchen soll ich wählen?
DES verschlüsselt immer nur 8 Byte auf einmal; der Modus legt fest, wie längere Daten in Blöcke zerlegt und wie die Blöcke miteinander verknüpft werden. ECB verschlüsselt jeden Block für sich, dadurch ergibt gleicher Inhalt gleichen Chiffretext und Muster werden sichtbar – nicht empfohlen. CBC verknüpft jeden Block vor dem Verschlüsseln mit dem vorherigen Chiffretextblock, den ersten mit dem IV; das ist die häufigste Wahl. CFB, OFB und CTR machen aus DES einen Schlüsselstrom, der Byte für Byte per XOR mit den Daten verknüpft wird, daher ist kein Padding nötig.
Schlüssel, IV und Padding
Ein DES-Schlüssel hat 8 Byte, wobei das niedrigste Bit jedes Bytes ein Paritätsbit ist und nicht in die Berechnung eingeht; die effektive Schlüssellänge beträgt daher nur 56 Bit. Bei mehr als 8 Byte werden nur die ersten 8 verwendet, wie bei DESKeySpec in Java und in CryptoJS; kürzere Schlüssel führen zu einer Fehlermeldung. Alle Modi außer ECB brauchen einen IV mit 8 Byte. Er muss nicht geheim sein, sollte aber mit demselben Schlüssel nie wiederverwendet werden.
ECB und CBC verlangen, dass die Datenlänge ein Vielfaches von 8 Byte ist; zu kurze Daten werden gemäß dem gewählten Padding aufgefüllt. PKCS5Padding und PKCS7Padding sind bei DES identisch und am weitesten verbreitet. ZeroPadding füllt mit Nullen auf und entfernt beim Entschlüsseln alle Null-Bytes am Ende – endet der Klartext selbst auf Null-Bytes, gehen auch sie verloren. NoPadding füllt nichts auf, die passende Länge musst du selbst sicherstellen.
Zuordnung zu Java und CryptoJS
Java: Cipher.getInstance("DES/CBC/PKCS5Padding") bedeutet CBC mit PKCS5Padding; bei nur "DES" gilt standardmäßig ECB mit PKCS5Padding. In Java funktioniert CTR nur mit NoPadding. Bei CryptoJS.DES.encrypt entsprechen sich Modus und Padding namentlich, CryptoJS.pad.Pkcs7 steht für PKCS7Padding. Für neue Systeme solltest du direkt AES verwenden.
Häufige Fragen
Kann ich hier mit 3DES (DESede, TripleDES) ver- und entschlüsseln?
Nein, hier gibt es nur einfaches DES. Ein 3DES-Schlüssel hat 16 oder 24 Byte; fügst du einen solchen ein, werden nur die ersten 8 Byte verwendet, das Ergebnis weicht also von 3DES ab, und neben dem Schlüsselfeld erscheint der Hinweis „nur die ersten 8 Byte werden verwendet“. Für 3DES nimmst du ein Tool, das DESede unterstützt.
Was tun bei „Der Schlüssel hat N Byte; ein DES-Schlüssel braucht mindestens 8 Byte“?
Weniger als 8 Byte führen zu einer Fehlermeldung; hier wird nicht automatisch mit Nullen aufgefüllt, du musst selbst auf 8 Byte ergänzen. Häufiger passiert ein Fehler beim Format: Ist ein hex-Schlüssel mit 16 Zeichen eingetragen, das Schlüsselformat aber auf string gestellt, wird er als 16 Byte Text behandelt und nur die ersten 8 Zeichen werden verwendet. Es gibt keine Fehlermeldung, nur den Hinweis „nur die ersten 8 Byte werden verwendet“ neben dem Schlüsselfeld und unter dem Ergebnis – das Ergebnis passt dann natürlich nicht. Bei string wird die Byte-Zahl nach dem gewählten Zeichensatz berechnet: Ein Umlaut wie ä belegt in UTF-8 2 Byte, ein chinesisches Schriftzeichen 3 Byte.
Was tun bei „Der IV hat N Byte; dieser Modus braucht genau 8 Byte“?
Der IV bei DES muss genau 8 Byte lang sein, nicht 16 Byte wie bei AES, und das gilt für alle Modi außer ECB. Ein Schlüssel mit mehr als 8 Byte wird auf die ersten 8 gekürzt, der IV nicht: Zu lang oder zu kurz führt sofort zu einem Fehler, ein 16-Byte-IV aus AES-Einstellungen muss also auf 8 Byte geändert werden. Auch hier lohnt der Blick aufs Format: 16 hex-Zeichen ergeben 8 Byte, dieselben 16 Zeichen im Format string dagegen 16 Byte. ECB braucht keinen IV, die IV-Zeile ist dann ausgeblendet.
Was tun, wenn beim Entschlüsseln „ungültiges Padding“ oder „kein Vielfaches von 8“ gemeldet wird?
Ist die Länge des Chiffretexts kein Vielfaches von 8, wurde meist unvollständig kopiert, oder hex und base64 sind vertauscht. Die Meldung „ungültiges Padding“ bedeutet in der Regel, dass Schlüssel, IV, Modus oder Padding nicht zu den Einstellungen beim Verschlüsseln passen. ZeroPadding und NoPadding prüfen das Padding nicht und melden diesen Fehler daher nie; bei falschen Parametern kommt aber Zeichensalat heraus.
Der Anfang des entschlüsselten Texts ist unleserlich, oder es heißt, das Ergebnis sei kein gültiger UTF-8-Text
Prüfe zuerst den IV. Ist der Chiffretext länger als ein Block, verdirbt ein falscher IV bei CBC und CFB nur den ersten 8-Byte-Block; der Rest wird korrekt entschlüsselt und es erscheint kein Padding-Fehler – am Anfang steht also Zeichensalat, danach korrekter Text. Heißt es, das Ergebnis sei kein gültiger Text, kann auch der Zeichensatz vom Verschlüsseln abweichen, etwa weil die Gegenseite GBK verwendet hat. Stellst du das Ausgabeformat auf hex, kannst du zunächst prüfen, ob die entschlüsselten Bytes selbst stimmen.
Das Ergebnis passt nicht zu Java oder CryptoJS – wie finde ich den Fehler?
Prüfe der Reihe nach: Modus und Padding, Format und Byte-Zahl von Schlüssel und IV, Zeichensatz sowie Ein- und Ausgabeformat. Klartext im Format string wird nicht von Leerzeichen am Anfang und Ende bereinigt – schon ein zusätzlicher Zeilenumbruch am Ende ergibt andere Daten. CTR, CFB und OFB füllen hier ebenfalls nach dem gewählten Padding auf; mit PKCS5Padding ist der Chiffretext daher länger als der Klartext, und verwendet das Backend NoPadding, wähle auch hier NoPadding. CFB ist hier die Variante mit 64-Bit-Vollblock-Rückkopplung und passt daher nicht zu einem Backend mit CFB8.
Das Ergebnis von CryptoJS.DES.encrypt beginnt mit U2FsdGVkX1 – lässt es sich hier entschlüsseln?
Nein. Übergibst du CryptoJS.DES.encrypt(Klartext, String) einen String, behandelt CryptoJS ihn als Passphrase: Es fügt ein zufälliges Salt hinzu und leitet Schlüssel und IV wie OpenSSL ab, das Ergebnis beginnt dann mit U2FsdGVkX1. Dieses Format wird hier nicht unterstützt. Damit das Ergebnis zu diesem Tool passt, wandle den Schlüssel in CryptoJS mit CryptoJS.enc.Utf8.parse in Bytes um, übergib ihn so und lege iv, mode und padding ausdrücklich fest.
Was speichert der Verlauf, und wird er hochgeladen?
Der Verlauf wird nur im localStorage des Browsers auf diesem Gerät gespeichert und nicht hochgeladen; im Seitencode gibt es keine Netzwerkanfragen. Nach jeder erfolgreichen Ver- oder Entschlüsselung wird ein Eintrag angelegt, höchstens 20 bleiben erhalten; Eingaben oder Ergebnisse mit mehr als 20.000 Zeichen werden nicht aufgezeichnet. Ein Eintrag enthält die Parameter, den IV, die Eingabe und das Ergebnis sowie einen 8-stelligen Fingerabdruck, der aus den ersten 8 Byte des Schlüssels berechnet wird (die Zeichen nach dem # in jedem Eintrag; daran erkennst du, ob es derselbe Schlüssel war), aber nie den Schlüssel selbst – nach einem Klick auf „Übernehmen“ musst du den Schlüssel also erneut eingeben. Jeden Eintrag kannst du einzeln löschen; auf einem öffentlichen Computer klickst du nach der Nutzung auf „Verlauf leeren“.