2017-10-27 4 views
0

Ich mache Entschlüsselung einiger verschlüsselter Daten. Sagen wir, die Daten sind eine sehr vertrauliche Information. Die Information wird mit dem Algorithmus tripledes_cbc verschlüsselt. Der geheime Schlüssel, der zum Verschlüsseln der Information verwendet wird, ist mit dem Algorithmus rsa verschlüsselt.Immer Müll nach tripledes_cbc Verschlüsselung mit NoPadding Schema

Aber wenn ich versuche, die Informationen mit DESede/CBC/NoPadding Algorithmus zu entschlüsseln, bekomme ich die ursprünglichen Daten zusammen mit einigen Garbage-Zeichen aufgefüllt an der Front und am Ende.

Wenn ich versuche, DES/CBC/PKCS5Padding anstelle von DESede/CBC/NoPadding zu verwenden, bekomme ich "Endblock nicht ordnungsgemäß gepolstert" Ausnahme.

Folgendes ist das Code-Snippet. Bitte lassen Sie mich wissen, was kann ich den richtigen Text ohne zusätzliche Polsterung bekommen tun:

 KeyStore ks = KeyStore.getInstance("jks"); 
     FileInputStream fis = new FileInputStream(ksFile); 
     ks.load(fis, "testing".toCharArray()); 

     PrivateKey privateKey = (PrivateKey) ks.getKey("keys", "1234".toCharArray()); 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, privateKey); 
     byte[] kekBytes = cipher.doFinal(Base64.decodeBase64(encKey.getBytes("UTF-8"))); 

     SecureRandom random = new SecureRandom(); 
     byte[] iv = new byte[8]; 
     random.nextBytes(iv); 

     SecretKey key = new SecretKeySpec(kekBytes, "DESede"); 
     Cipher cipher1 = Cipher.getInstance("DESede/CBC/NoPadding"); 
     cipher1.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); 
     byte[] out = cipher1.doFinal(Base64.decodeBase64(data.getBytes("UTF-8"))); 

     System.out.println("Data Length: " + out.length); 
     String result = new String(out, "UTF-8"); 
+1

1. 3DES sollte nicht für neue Arbeit verwendet werden, AES ist die aktuelle symmetrische Methode zu verwenden. Aber ich schätze, das ist ein Schulprojekt, und Schulen sind ein Jahrzehnt hinter der wirklichen Welt. 2. Geben Sie ein Beispiel für die erwarteten und entschlüsselten Daten ** im Hex-Format ** an. – zaph

+2

Offensichtlich müssen Sie herausfinden, welche Auffüllung von der Verschlüsselungsseite verwendet wurde. Verwenden Sie auch DES oder DESede? Denn 'DES/CBC/PKCS5Padding' ist keine sinnvolle Alternative zu' DESede/CBC/NoPadding'. Vielleicht meinten Sie "DESede/CBC/PKCS5Padding"? –

Antwort

0

Ihr Schlüssel korrekt ist, wenn der mittlere Teil richtig ist. Der Block am Anfang ist wahrscheinlich die IV, die dem Chiffretext vorangestellt wurde. Wenn Sie versuchen, das zu entschlüsseln, dann werden Sie Müll bekommen. Danach wird die IV selbst als Vektor für den nächsten Block genommen, so dass die CBC-Chiffre sich selbst korrigieren kann und korrekt weiterläuft. Theoretisch: CBC hat Fehlerfortpflanzung begrenzt.

Der Teil am Ende ist das verwendete Padding-Schema. Sie sollten versuchen, "DESede/CBC/PKCS5Padding". Wenn das nicht funktioniert, müssen Sie sich die binären Werte anschauen (in der Tat, zum Beispiel hexadecodiert) und das Padding-Schema herausfinden, das verwendet wird, damit Sie Ihre Daten entpacken können.

Beachten Sie, dass es in den Standardkryptografieanbietern für Java nicht so viele Paddingschemas gibt. So müssen Sie entweder einen Anbieter finden, der z. Bit Padding oder Sie können "NoPadding" verwenden und führen Sie das Padpad selbst aus.

Wenn dies für ein Online-Protokoll ist, ist es vielleicht an der Zeit, sich über Padding-Orakel-Attacken und in der Tat aktuellere Protokolle wie AES/GCM und RSA/OAEP zu informieren.

+0

Wie identifiziere ich Pading-Zeichen aus der hexadezimalen Darstellung der entschlüsselten Nachricht? Das hexadezimale Ergebnis sieht so aus (nur die ersten und letzten paar Zeichen, die hier gegeben sind): "5368f1b5beaa10ec3c6e73313a5061796d656e7443616c6c6261636b496e707574 ..................... 7443616c6c6261636b496e7075743ec9de7dc99f437f08" –

+0

@ K.Nath Erlaubt einige unbeabsichtigte unsichtbare Zeichen in den obigen hex-codierten Daten ist das Format 8-Byte Präambel, gefolgt von ASCII-codiertem Text, gefolgt von 8-Byte Daten. Warum denkst du, das ist falsch? – zaph

+0

@zaph - Ich meinte nicht, dass die Ausgabe falsch war. Ich wollte nur den Text ohne den gefüllten Müll extrahieren. Ich könnte den Müll, der vorne an der Ausgabe-Zeichenfolge aufgefüllt ist, überwinden, indem ich die ersten 16 Zeichen eliminiere (im obigen Kommentar - '5368f1b5beaa10ec'), wie ich sehe, unterscheiden sich die ersten 16 Zeichen jedes Mal, wenn ich den Java-Code ausführe. Aber ich bin nicht in der Lage, Müll aus dem Schwanz der Ausgabe-String als außer den ersten 16 Zeichen wie erwähnt zu entfernen, bleiben alle anderen Zeichen gleich, wenn ich den Java-Code ausführen. –

Verwandte Themen