Geheimtext durch eine 3DES-EDE-Verschlüsselung im CBC-Modus

Hallo Leute,
ich habe eine Hausaufgabe und weiß ehrlich gesagt nicht, wie ich das machen soll.
Deshalb bitte ich euch mir zu helfen.

Aufgabe:
Der folgende Geheimtext wurde durch eine 3DES-EDE-Verschlüsselung im CBC-Modusmit dem Schlüssel
0102030405060708 090a0b0c0d0e0e00 0102030405060708 berechnet:
338c6182c2d2f3b00f95d7b3133299484888ee509b6863fc7c1906ce0803d1ff
Wie lautet der Initialisierungsvektor?

In der Main-Methode soll dann die Lösung angezeigt werden. Also der Initialisierungsvektor.

Vielen Dank schonmal an alle, die mir helfen.

*** Edit ***

Kann mir keiner helfen? Das muss heute fertig werden :frowning:

etwas spät :slight_smile:

außerdem werden nicht viele 3DES jetzt auswendig parat haben, da müsstest du doch selber alles wissen - in welchem Fach ist das denn die Hausaufgabe?

und: du hast keine konkrete Frage gestellt.

Das Fach heißt Kryptographie

In der Main-Methode soll dann die Lösung angezeigt werden. Also der Initialisierungsvektor.

Das ist eigentlich die Frage :slight_smile:

Das Programm soll mit dem Schlüssel und dem Geheimtext den Initialisierungsvektor bestimmen.

Du möchtest also, dass dir jemand die Lösung einfach hinschreibt?

Abgesehen davon fehlen einige Informationen… Das fängt bei der Codierung des Schlüssels / der Chiffre an. Ich würde raten, dass das eine einfache Hexcodierung ist. Könnte aber auch was anderes sein.

Da der IV meinem Kenntnisstand nach nicht erraten werden soll, müsste euch doch ein Angriff auf die Chiffre erklärt worden sein, oder?

Ich glaube das ist eine Hexcodierung.

Das wurde bestimmt erklärt. Ich war in der letzten Vorlesung nicht da. Deshalb bin ich hier.
Ich möchte nur Hilfe und möchte wissen wie ich anfangen soll.

‘wissen wie ich anfangen soll’ ist schon die falsche Frage, die Aufgabe setzt vieles andere voraus,
stell dir vor sie wäre als Verschlüsseln Sie 'hallo' mit Key .. fomuliert,
dann auf einmal alles klar zur Durchführung oder genauso Bahnhof?

du musst DES & Co. schon kennen mit all dem üblichen Wissen zu Schlüsseln usw.,
die benötigten Java-Algorithmen dazu als zusätzliche kleine Wissenschaft für sich, etwa
Tutorial – Encryption And Decryption Using DESede (Triple DES) In Java - Kushal’s Java Blog | Software Engineering Blog
wie Strings zu Byte in bestimmten Charsets umgewandelt werden, wie Key als byte[] anzugeben, usw.,
welche Klassen zu nutzen, DESedeKeySpec, SecretKeyFactory oder doch wieder ganz andere? ein einziges Durcheinander je nach Verfahren wenn nicht genauen Durchblick,

auch musst du wissen was dein Prof. Dr. H.? mit seinen Schreibweisen meint, ist anscheinend ein 24 byte-Schlüssel?

ich habe spaßeshalber auch reingeschaut, aber wie sooft bei sowas ‘javax.crypto.BadPaddingException: Given final block not properly padded’,
da sind ja auch jede Menge Variablen zu bedenken, Bilndversuche taugen nicht,

Schritt für Schritt lernen nach Lehrbuch, dann weißt du auch was zu tun ist,
ansonsten Konsequenzen in den Hausaufgaben akzeptieren

Hier nochmal eine Zusammenfassung:
Geheimtext in Hex: 338c6182c2d2f3b00f95d7b3133299484888ee509b6863fc7c1906ce0803d1ff
Funktion: 3DES
Modus: CBC
Schlüssel in Hex: 0102030405060708 090a0b0c0d0e0e00 0102030405060708

Klartext und Initialisierungsvektor sind unbekannt.
Beim Klartext kommt glaube ich folgendes raus:
Hochschule Ostwestfalen-Lippe…

*** Edit ***

Wie DES und Co. funktioniert weiß ich. Aber das in Java umzusetzen ist ein Problem.

Kannst du Java?

James’ Pad: Java Triple DES example

liegt wohl näher dran, da ist auch von IvParameterSpec die Rede,
wieso braucht das aber auch beim Entschlüsseln den IvParameterSpec übergeben?

jetzt wären gute allgemeine Kenntnisse angebracht, wie funktioniert das Entschlüsseln?
Block cipher mode of operation - Wikipedia, the free encyclopedia
ah, muss am Ende auch noch wieder geXORt werden oder so,

mit dieser Hoffnung habe ich mich nochmal rangewagt und bin tatsächlich zu etwas gekommen,
im Zuge des Erfolgs und Selbstlobs poste ich mal ein wenig an Halblösung :wink:

{
    private static final String PLAIN_TEXT = "Hochschule Ostwestfalen-Lippe";

    public static void main(String args[])
        throws Exception
    {
        String algorithm = "DESede";
        String transformation = "DESede/CBC/PKCS5Padding";

        byte[] keyValue = new byte[]
            {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xe, 0, 1, 2, 3, 4, 5, 6, 7, 8};

        DESedeKeySpec keySpec = new DESedeKeySpec(keyValue);
        SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);

        IvParameterSpec iv = new IvParameterSpec(new byte[]
            {0, 0, 0, 0, 0, 0, 0, 0});

        Cipher encrypter = Cipher.getInstance(transformation);
        encrypter.init(Cipher.ENCRYPT_MODE, key, iv);

        byte[] input = PLAIN_TEXT.getBytes("UTF-8");
        System.out.println("in  : " + input.length + " - " + Arrays.toString(input));

        byte[] enc = encrypter.doFinal(input);
        System.out.println("enc1: " + enc.length + " - " + Arrays.toString(enc));
        enc = new byte[]
            {51, -116, 97, -126, -62, -46, -13, -80, 15, -107, -41, -77, 19, 50, -103, 72, 72, -120, -18, 80, -101, 104, 99, -4,
             124, 25, 6, -50, 8, 3, -47, -1};
        System.out.println("enc2: " + enc.length + " - " + Arrays.toString(enc));

        Cipher decrypter = Cipher.getInstance(transformation);
        decrypter.init(Cipher.DECRYPT_MODE, key, iv);

        byte[] decrypted = decrypter.doFinal(enc);

        System.out.println("de  : " + decrypted.length + " - " + Arrays.toString(decrypted) + "
" + new String(decrypted, "UTF8"));
    }
}

Ausgabe:

in  : 29 - [72, 111, 99, 104, 115, 99, 104, 117, 108, 101, 32, 79, 115, 116, 119, 101, 115, 116, 102, 97, 108, 101, 110, 45, 76, 105, 112, 112, 101]
enc1: 32 - [-69, 108, -27, -70, -71, -11, 13, 49, -113, 11, 108, -33, -88, 56, 113, 118, 38, -102, 0, 29, -46, 112, 102, -128, -119, -25, -43, -62, 12, 126, 25, 109]
enc2: 32 - [51, -116, 97, -126, -62, -46, -13, -80, 15, -107, -41, -77, 19, 50, -103, 72, 72, -120, -18, 80, -101, 104, 99, -4, 124, 25, 6, -50, 8, 3, -47, -1]
de  : 29 - [-126, -111, 98, 121, 98, 115, -57, -117, 108, 101, 32, 79, 115, 116, 119, 101, 115, 116, 102, 97, 108, 101, 110, 45, 76, 105, 112, 112, 101]
��bybsNjle Ostwestfalen-Lippe

die ersten 8 Bit sind noch falsch, weil der Initialisierungsvektor 0,0,0,0,0,0,0,0 falsch ist

wenn von hier aus alleine weiter, dann zumindest ein wenig auch alleine geschafft…

Vielen Dank für den Code. Komme jetzt etwas weiter und habe jetzt etwas mit dem ich was anfangen kann.

Du hast ja in der Zeile
private static final String PLAIN_TEXT = “Hochschule Ostwestfalen-Lippe”;
den Klartext angegeben. Der Klartext ist nicht bekannt. Das habe ich mit einem Online-Tool entschlüsseln lassen, um einen Überblick zu schaffen.
Wie bekomme ich den Klartext raus?

@SlaterB : nicht schlecht :wink:
Ab hier ist es trivial den richtigen IV zu ermitteln, wenn man sich das von dir verlinkte Diagramm auf Wikipedia ansieht…

Allerdings ist der IV theoretisch nicht bestimmbar. Denn: wie wäre es mit dem IV CEF0051C101BA6E7?

auch wenn das eigentlich halb mit zur Aufgabe gehört…:
der Klartext wird ja nicht sofort benötigt, das decrypt auf das Array aus der Aufgabenstellung ab Zeile 28 läuft auch so und liefert ‚??bybs?le Ostwestfalen-Lippe‘

‚Der Klartext ist nicht bekannt. Das habe ich mit einem Online-Tool entschlüsseln lassen, um einen Überblick zu schaffen.‘ = dasselbe Vorgehen, nur mit anderem Programm?
oder kommst du dort auch auf ‚Hochschule‘?

wenn Anfang in der Schwebe und um nun einen Initialisierungsvektor zu wählen muss man ein Ziel haben, also ‚Hochschule‘,
könnte auch was anderes dort stehen und dann anderer Initialisierungsvektor, das ist nun variabel, aber nicht zu sehr

@SlaterB
Richtig, ich bekomme ??bybs?le Ostwestfalen-Lippe… raus. “Hochschule” war meine Vermutung.
Habe das hier getestet: 3DES Encryption – Easily encrypt or decrypt strings or files

Stimmt, den Klartext brauchen wir nicht. In der Aufgebenstellung steht es zumindest nicht.

PS: Meine vorherige Antwort wurde irgendwie nicht veröffentlicht. Der Moderator soll glaube ich freigeben. Vielleicht weil dort ein Link enthalten war?

[edit SlaterB: tjaja, Spamschutz, nun da]

Probier meinen IV aus :wink:

*** Edit ***

C&P freundlich: {-50, -16, 5, 28, 16, 27, -90, -25}. Den richtigen hab ich natürlich auch, aber ich möchte ja nicht den Spaß verderben.

Lagerhalle …
Wie berechne ich das für Hochschule? Oder wie berechne ich denn jetzt den iv statt ihn zu definieren?

Das ist das letzte kleine Bisschen an eigenständiger Arbeit, die du selbst erledigen musst… Mit @SlaterB s Post brauchst du nicht einmal einen PC - ein besserer Taschenrechner reicht aus, um die Lösung zu berechnen…

notfalls durch Ausprobieren inklusive Java-Unterstützung (Schleife): versuche so viele verschiedene Werte fürs erste Byte im IV wie möglich
und schaue dir an, was dann jeweils das Ergebnis beim Decrypt ist

Beitrag von 19:48 freigeschaltet

Ok, wahrscheinlich ist es jetzt zu spät, aber: wie fließt der IV bei CBC in die Berechnung des Klartextes mit ein?

Mal davon abgesehen dass man eigentlich in der Regel zusätzliche Zeit bekommt wenn man auf Grund Krankheit Fehlzeiten hat (wobei es auch dann immer noch deine Pflicht ist dir irgendwie den behandelten Stoff zu organisieren (bei Mitschülern erfragen)) … meinst du nicht das es ETWAS spät ist/war sich am Tag der Abgabe zu melden ?

Gut, so lange die Regel „Nie eine Kombination aus Schlüssel und IV zwei mal verwenden!“ beachtet wird muss der IV nicht geheimgehalten werden. Bietet somit zwar auch eine gewisse Angriffsfläche, macht die Aufgabe aber auch durch bekanntgabe des Schlüssels sowie des genauen Algorithmus erst möglich.

War ja, soweit ich dich richtig verstanden habe, nicht die Aufgabe. Sicher : man braucht den Klartext um den korrekten IV ermitteln zu können, denn auch ein falscher IV liefert mit unter sinnvolle/gültige Ergebnisse.

Auch wenn mir nicht ganz klar werden will welcher Angriff hier aufgezeigt werden soll (denn letztlich funktioniert DAS DA auch mit AES-128) so beruht ein symetrisches Kryptosystem auf der Geheimhaltung des Schlüssels. Warum man nun „rückwärts“ mit bekanntem Schlüssel einen „korrekten“ IV berechnen soll ohne den korrekten Plaintext zu kennen (denn wie gezeigt gibt es mehrer „sinnvolle“ IV) erschließt sich mir leider nicht.