![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 | |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Ich hab nen PHP-Code der mit mcrypt, TripleDES und dem benötigten Key arbeitet. Er funktioniert, kein Ding.
Mit Java hab ich aber bei dem gleichen Key die Meldung, dass die Keygröße nicht stimmt. Wikipedia meint dazu, dass der TripleDES Key 24 Zeichen, also 168 Bits lang sein muss. Nun hab ich geschaut was PHP da macht: Zitat:
Mein eigentliches Problem ist nun, dass ich bestehende Dinge Ver- und Entschlüsseln muss und daher den Key brauch. Da TripleDES aber nur mit 168 Bit Key funktioniert, muss mcrypt oder das PHP-Modul von mcrypt den gegebenen Key auf 24 Zeichen auffüllen. Und genau hier brauch ich Hilfe: Mein C ist sowas von schlecht, dass ich nicht herausfinde, mit was der Key aufgefüllt wird, um dann TripleDES nutzen zu können. Ist hier jemand der Lust hat im C-Code zu stöbern und herauszufinden was passiert, wenn der Key zu kurz ist? Die Mcrypt-Sourcen gibts hier: mcrypt-src Ich revangiere mich auch bei Gelegenheit
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 27.02.2006
Beiträge: 146
|
Hallo,
ich will Dir nicht die Illusion rauben, aber laut der mcrypt_set_key wird zwar eine Länge len angegeben aber nicht ausgewertet. Die Funktion erwartet immer ein mindestens 24 zeichen langes Feld user_key, den es in eine interne Struktur umwandelt. Bei kürzeren Feldern dürfte dann, wenn nicht gerade Zugriffsfehler auftreten, ein beliebiger Wert auf Basis der Speichervorbelegung sein. Die Frage ist daher, wie wird unter PHP die mcrypt-Funktion betankt bei kürzeren Schlüsseln. Gruß, Jumepr, the II. |
|
|
|
|
|
Nach oben #3 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Naja irgendwo muss der Key ja aufgefüllt werden
Falls du noch lust hast, schau dir doch das mcrypt-Modul von PHP4 an, vielleicht kannst du mir dann die Frage beantworten Hier gehts zur Quelle: http://crypto.riken.go.jp/archives/l...p/php4-mcrypt/ ( php4-mcrypt_4.3.10.orig.tar.gz )
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 27.02.2006
Beiträge: 146
|
Also ich bin mir gar nicht sicher, dass hier ein Key aufgefüllt wird. mcrypt unterstützt verschiedene Keys. Anhand der Schlüssellänge ermittelt er, welchen Algorithmus er verwenden soll. Entspricht der Key keiner der vordefinierten Längen, wird der Algorithmus verwendet, der am nächsten dran ist. D.h. bei 24, 20, 16, 12 Zeichen wird ein 19-zeichen key versucht, mit dem Algorithmus des 16-Zeichen-Keys zu verarbeiten.
Ergo: Vermutlich hast Du dann kein TripleDES. Ach ja, ich hatte mir die Sourcen vom 5'er php angesehen .... das Geheimnis liegt tatsächlich in der zentralen mcrypt-start-funktion (mcrypt.c: internal_init_mcrypt). gruß, Jumper, the II. |
|
|
|
|
|
Nach oben #5 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Die PHP-Methode zum verschlüsseln:
PHP-Code:
Ich glaube kaum das PHP einfach den Verschlüsselungsmechanismus ändert ohne wenigstens ne Warnung zu geben... Aber selbst wenn ich kein TripleDES hab, was hab ich dann?
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 27.02.2006
Beiträge: 146
|
Ohhhh ... Ein Beispiel ..... und unsereiner muss nicht mehr raten .....
In dieser Definition werden Key und Iv auf die jeweilige Länge festgeschraubt und auf 0 (Null) gesetzt .... Anschließend werden die vorhandenen Werte in die neuen Speicherbereiche hinein kopiert (längengeprüft). Das ganze geschieht im Ext_Module mcrypt in PHP. Also alle Werte zum ende mit '\x0' auffüllen. Gruß, Jumper, the II. |
|
|
|
|
|
Nach oben #7 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Bzgl Beispiel: das ist firmeninterna, musste daher erst erlaubnis einholen...
Dummyfrage: wie mach ich das in java? also \x0 an nen String hängen bzw byte[] erweitern... und das encoding ist doch dann auch wichtig oder?
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #9 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Habs hinbekommen (stell mich dümmer an als ich bin
aber ich hab jetzt ClassCastExceptions... alles scheisse ey
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #11 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Ha alles sch...
Ich verschlüssel so gut jetzt, dass ich 1. nie das gleiche verschlüsselte Ergebnis am ende raus hab, 2. der sich von php unterscheidet und 3. ich nicht mehr entschlüsseln kann, da ich ne BadPaddingException bekomme... also irgendwie haut das alles nicht hin...
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #13 |
|
Erfahrener Benutzer
Registriert seit: 27.02.2006
Beiträge: 146
|
So, es hat zwar etwas länger gedauert ... dafür hole ich den hier noch mal aus der Versenkung.
Mittels Java kann ich erst einmal nicht nachvollziehen, wo WarrenFaith seinen Fehler hat. Hier eine simple Lösung zu TripleDES in Java ... Auch gleichzeitig eine Prinzip-Lösung für Ver-/Entschlüsselung unter Java Code:
import java.security.AlgorithmParameters;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class test1 {
private static String byteArray2HexString( byte[] byteArray) {
return( byteArray2HexString( byteArray, byteArray.length));
}
private static String byteArray2HexString( byte[] byteArray, int len) {
StringBuffer buf = new StringBuffer();
for( int l00 = 0; l00 < len; l00++) {
byte b00 = byteArray[l00];
int pos = (b00 >> 4) & 0xf;
buf.append( "0123456789ABCDEF".substring( pos, pos+1));
pos = (b00) & 0xf;
buf.append( "0123456789ABCDEF".substring( pos, pos+1));
}
return( buf.toString());
}
public static void main( String[] args) {
if( args.length < 2) {
System.out.println( "Using: test1 <key> <text>\n");
System.exit( 1);
}
String testKey = args[0];
String testText = args[1];
System.out.println( "Key: " + testKey);
System.out.println( "Text: " + testText);
try {
// Konvertiere Key in ein verarbeitbares Objekt
SecretKeyFactory skf = SecretKeyFactory.getInstance( "DESede"); // TribleDES-KeyFactory
byte[] desKeyData = new byte[DESedeKeySpec.DES_EDE_KEY_LEN]; // byte-array
for( int l00 = 0; l00 < DESedeKeySpec.DES_EDE_KEY_LEN; l00++) { // memset -> 0
desKeyData[l00] = 0;
}
int len = testKey.length(); // prüfe, ob die Schlüssellänge zu kurz ist
if( len > DESedeKeySpec.DES_EDE_KEY_LEN) {
len = DESedeKeySpec.DES_EDE_KEY_LEN;
}
for( int l00 = 0; l00 < len; l00++) { // kopiere Schlüssel ein
desKeyData[l00] = testKey.getBytes()[l00]; // (der rest ist mit 00 aufgefüllt!)
}
DESedeKeySpec desKeySpec = new DESedeKeySpec(desKeyData); // TribleDES-Key Specification
SecretKey sk = skf.generateSecret( desKeySpec); // TribleDES-Key
Cipher c00 = Cipher.getInstance( "DESede/ECB/NoPadding"); // Cipher holen mit Parameter
// DESede -> TribleDES
// ECB -> MCRYPT_MODE_ECB
// NoPadding -> Default bei mcrypt?
System.out.println( "Original: " + byteArray2HexString( testText.getBytes()));
c00.init( Cipher.ENCRYPT_MODE, sk); // Cipher zur Verschlüsselung vorbereiten
byte[] testEncrypt = c00.doFinal( testText.getBytes()); // Encrypt
System.out.println( "Encrypt: " + byteArray2HexString( testEncrypt));
c00.init( Cipher.DECRYPT_MODE, sk); // Cipher zur Entschlüsselung vorbereiten
byte[] testDecrypt = c00.doFinal( testEncrypt); // Decrypt
System.out.println( "Decrypt: " + byteArray2HexString( testDecrypt));
}
catch( Exception e) {
System.out.println( "Error ... " + e);
e.printStackTrace( System.out);
}
}
}
Code:
Testtext: Hallo, dies ist der Test zur Verschlüsselung ... Testtext(hex:( 48616c6c6f2c206469657320697374206465722054657374207a7572205665727363686cfc7373656c756e67202e2e2e Testkey: 0000 Encrypt: 4a0371988d67ad0ea7b60ac1c77a743f4c01a447a955235e20a3127e15385cc516f9bbbb5f62a8b37b9a873e530ef655 Code:
Key: 0000 Text: Hallo, dies ist der Test zur Verschlüsselung ... Original: 48616C6C6F2C206469657320697374206465722054657374207A7572205665727363686CFC7373656C756E67202E2E2E Encrypt: 4A0371988D67AD0EA7B60AC1C77A743F4C01A447A955235E20A3127E15385CC516F9BBBB5F62A8B37B9A873E530EF655 Decrypt: 48616C6C6F2C206469657320697374206465722054657374207A7572205665727363686CFC7373656C756E67202E2E2E Gruß, Jumper, the II. |
|
|
|
|
|
Nach oben #14 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Hey danke dir, ich werd das heut oder morgen mal durchtesten, aber ich denke ich weiß schon wo ich scheitern werde :/ and der Keylängenüberprüfung.
Aber ich danke dir schonmal für deine Arbeit. Bis morgen...
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #15 |
|
Erfahrener Benutzer
Registriert seit: 27.02.2006
Beiträge: 146
|
*hihihi* Key-Längenprüfung? Ich hatte es mit einem Key "0000" hier vorrechnen lassen ...... Das ist inklusive .....
Der Java-Code sollte so 1:1 mit Key und Ver-/Entschlüsselung mit php/mcrypt arbeiten ... alles andere wäre Murks und hätte Dein Problem nicht getroffen .... Gruß, Jumper, the II. |
|
|
|
|
|
Nach oben #16 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Verdammt tatsache, recht haste. Hab deinen Key komplett übersehen
![]() Das machts doppelt interessant. Ich meld mich. Versprochen!
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #17 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
So erste Tests, gleiches Ergebnis :/ Wenn ich verschlüssel, dann bekomme ich z.B. sowas raus: [B@8997d1 Das ist ja nunmal total was anderes, da dort Sonderzeichen drin sind die gar nicht drin sein drüften. Und da das ding ne länge von 9 Zeichen hat, ist klar das ich das als Antwort bekomme: Code:
java.lang.RuntimeException: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher at com.dpmedia.rainbow.controller.utils.TripleDes.decrypt(TripleDes.java:57) at com.dpmedia.rainbow.controller.utils.TripleDesTest.test(TripleDesTest.java:16) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher at com.sun.crypto.provider.SunJCE_h.b(DashoA12275) at com.sun.crypto.provider.SunJCE_h.b(DashoA12275) at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DashoA12275) at javax.crypto.Cipher.doFinal(DashoA12275) at com.dpmedia.rainbow.controller.utils.TripleDes.decrypt(TripleDes.java:55) ... 24 more java Code:
|