# JNI DLL Aufruf



## DerSchokoBär (7. Nov 2012)

Hallo Community,

und zwar versuche ich gerade meinen C-Code mittels JNI in mein Java-Programm einzubinden:

```
public class DLLAufrufen {

    static {
        System.loadLibrary("dllmain");
    }
    
    public static native void HelloWorld();
    public static native String HelloWorld2(String input);
    
    public static void main(String[] args) {
        System.out.println("main");
        System.out.println(HelloWorld2("gdsgd"));
        String tempString = "" + HelloWorld2("Hallo");
        System.out.println(tempString);
        System.out.println("main");
    }  
}
```

Die Funktion, die ich in der DLL aufrufe, gibt einen jstring zurück, sollte also kompatibel sein. Wenn ich das ganze mit der Konsole ausführe, wird auch alles innerhalb in der Funktion in C ausgeführt. Der restliche Java-Code wird aber nicht ausgeführt d.h. es wird nichts mehr ausgegeben. 

Wenn ich das Programm unter NetBeans ausführe, kommt dieser Fehler:
Java Result: -1073741819
In hexadezimal anscheinend 0xc0000005 unter Windows ein provozierter Fehler.

Wenn ich das Programm unter Eclipse (wie auch unterNetBeans) ausführe wird auch nur "main" ausgegeben.

Der C-Code sieht folgendermaßen aus:

```
JNIEXPORT jstring JNICALL Java_DLLAufrufen_HelloWorld2 (JNIEnv * env, jclass myclass, jstring inString)

{
  MD5_CTX mdContext;

  const char *nativeString = (*env)->GetStringUTFChars(env, inString, 0);
  unsigned int len = strlen (nativeString);

  MD5Init (&mdContext);
  MD5Update (&mdContext, inString, len);
  MD5Final (&mdContext);
  
  int i,j;
  unsigned char *p;
  for (i = j = 0; i < 16; i++, j+=2) {
    sprintf( p+j, "%02x", mdContext.digest[i]);
  }
  
  (*env)->ReleaseStringUTFChars(env, inString, nativeString);
  char *buf;
  strcpy(buf, p);
  printf("\ntest %s\n", buf);
  return (*env)->NewStringUTF(env, buf);
}
```

Die Werte die ich bekomme stimmen, die per Konsole ausgegeben werden, daher verzichte ich darauf den restlichen Code zu posten. Anscheinend können auch keine Sachen, die im C-Code per Konsole ausgegeben werden, in der Eclipse oder NetBeans Konsole angezeigt werden, was allerdings auch nicht schlimm ist. Wenn ich das Programm aber manuell in der Konsole ausführe, kann alles angezeigt werden, was per Konsole ausgegeben werden soll.

Danke schon im voraus
DerSchokoBär


----------



## mjdv (7. Nov 2012)

```
char *buf;
strcpy(buf, p);
```

Das geht schief! Du kopierst hier irgendwo in den speicher. Du musst vorher den Speicher resevieren!

Wenn es nur darum geht eine MD5 zu berechnen, das kann Java auch!

EDIT:

Auch das hier sieht komisch aus:


```
int i,j;
  unsigned char *p;
  for (i = j = 0; i < 16; i++, j+=2) {
    sprintf( p+j, "%02x", mdContext.digest[i]);
  }
```

Bin zwar kein Experte in C, aber du kopierst hier auch wieder irgendwo in den Speicher rein. Wo sind eigentlich deine Konsolenausgaben?


----------



## DerSchokoBär (7. Nov 2012)

Mh, bin leider kein C-Experte. Habe es geändert:

```
char *buf = (char*)malloc(33);
```

Den anderen Code-Ausschnitt habe ich sogar aus einem C-Forum.
Aktuell sieht die Konsolenausgabe so aus (wenn ich es manuell per Konsole starte):

```
main

test *hash*
```

Das "main" kommt vom Java-Programm der Rest vom C-Teil.


----------



## mjdv (7. Nov 2012)

Huch, sorry, hatte das printf gar nicht gesehen. Lass das buf mal ganz weg, du hast die Daten ja schon in p drinnen, mach aus dem einfach den String. Aber du musst natürlich auch hier erstmal den Speicher holen!

Allerdings nicht mit malloc, da du dann ein Speicher Leck hast. Mach dir einen konstant großen char buf[17] oder sowas, die MD5 Sum ist ja immer gleich groß. Vergiss nicht, die '\0' am Ende des Strings, sonst weiß ja niemand wann der C String zu Ende ist.

Edit: Du kannst es natürlich auch mit malloc machen, dann musst du aber auch ein free aufrufen  Aber ich denke in diesem Fall ist die Variante auf dem Stack besser.


----------



## DerSchokoBär (7. Nov 2012)

Danke für die Hilfe, funktioniert jetzt! 

Update:

```
JNIEXPORT jstring JNICALL Java_DLLAufrufen_HelloWorld2 (JNIEnv * env, jclass myclass, jstring inString)

{
  MD5_CTX mdContext;

  const char *nativeString = (*env)->GetStringUTFChars(env, inString, 0);
  unsigned int len = strlen (nativeString);

  MD5Init (&mdContext);
  MD5Update (&mdContext, inString, len);
  MD5Final (&mdContext);
  
  int i,j;
  unsigned char p[33] = {0};
  for (i = j = 0; i < 16; i++, j+=2) {
    sprintf( p+j, "%02x", mdContext.digest[i]);
  }

  (*env)->ReleaseStringUTFChars(env, inString, nativeString);
  return (*env)->NewStringUTF(env, p);
}
```


----------



## DerSchokoBär (8. Nov 2012)

Jetzt bleibe ich bei einem anderen Problem stecken:
Anscheinend funktioniert der Hash nicht. Den Algorithmus habe ich von dieser Seite:
http://www.tierradelazaro.com/public/criptologia/md5codigofuente.txt
Ich denke der greift auch nur auf vorhandene md5-Bibiliotheken zu. Grundlegendes habe ich ja in der MDString nicht verändert, eben nur auf meine Bedürfnisse zugeschnitten, ich mische mich ja gar nicht in den Algorithmus ein.
Für zz sollte beispielsweise 25ed1bcb423b0b7200f485fc5ff71c8e rauskommen, dabei kommt bei jedem Programmstart ein neuer Wert heraus, wenn ich das Programm mit der DLL hashen lassen. Ich zeig mal kurz einen Ausschnitt:

```
qz ae7eb1e86da5f9c90e67f0ce3e55148b
rz 667e40238c7e7c8f0a63d3f70b26d69c
sz 32ef8ae06098ff542442310ced90c8c2
tz 07b10613628ca2815e23731981c79c19
uz 7489bc5a41cf5223cc71e2bc556a62c2
vz 26225fe6889e069eb6706235c7fc7a83
wz 83002a8f3a41eb9e04845aaf8a07541b
xz 9f33b1a28c4d9006833930be51ab9a6f
yz 12085c26a74d356af4e05880a5f355bd
zz 627713ec65a40fbbbfc0b13e1f0746bb
```

Dabei sollte die Ausgabe so aussehen:

```
qz 3879186336b2b4a1ad89cadf910a5b19
rz 80fcd632dc2558177aaf6f8f5cd57678
sz 7dabf5c198b0bab2eaa42bb03a113e55
tz 73bb4387b3075739eacb9cd62ac4049c
uz 8b3274b755aa033902f57fb557e25923
vz 54107dd5d77b8a3bcbc0faecd128de7c
wz d0965c07d1a00fcc85d28b8a241ae35a
xz dbd69ee9ae289a85ea34dbef8435d7c1
yz 2151a2bc77807b81113febbf50c4bc95
zz 25ed1bcb423b0b7200f485fc5ff71c8e
```
Den korrekten Durchlauf kann ich nur erbringen, wenn ich mit der Java-Bibliothek hashe.

Das ist der Java-Code

```
public class BruteForcer {
    
    HashGenerator hashGenerator = new HashGenerator();
    String hashString;
    
    static {
        System.loadLibrary("dllmain");
    }
    
    public static native void HelloWorld();
    public static native String MD5Hash(String input);
    
    public String bruteForcerMD5(String input, int pwLength) throws NoSuchAlgorithmException {
        char ini  = 'A';
        String testString = "";
        
       for(int integerChar1 = (int)ini; integerChar1 <= 122; integerChar1++) {
            for(int integerChar2 = (int)ini; integerChar2 <= 122; integerChar2++) {
                testString = "" + (char)integerChar2 + (char)integerChar1;
                // hashString = MD5Hash(testString); // in dieser Zeile greife ich auf die Funktion der DLL zu
                hashString = hashGenerator.makeMD5Hash(testString); // in dieser Zeile würde ich mit Java hashen
                System.out.println(testString + " " + hashString);
                if(input.equals(hashString)) {
                    return testString;
                }
            }

        }
      
        return "konnte nicht ermittel werden";
    }
}
```

Den C-Code habt ihr ja bereits gesehen.

Meine Vermutung ist, dass irgendetwas bei der Stringübergabe nicht stimmt.[/quote]


----------



## mjdv (8. Nov 2012)

Mach mal wieder die Konsolenausgabe in dem C Code rein. Stimmts da?

Ansonsten, wieso ist p unsigned? Mach das mal zu einem normalen char.


----------



## DerSchokoBär (8. Nov 2012)

Also ich hab den ganzen Source-Code von der Website rauskopiert und ohne Änderungen kompiliert, danach über die Konsole gestartet und den String "zz" übergeben, das wurde dann auch richtig gehasht d.h. es kann nicht an der Bibliothek liegen.

Hab das jetzt noch in einen normalen Char geändert.

Wenn ich das Programm über Konsole starte, tritt dasselbe Problem auf. Hab ein kleines Testprogramm geschrieben das nur den String "zz" übergibt, dasselbe Probleme. Allerdings ist es immer derselbe Hash für "zz" egal wie oft ich es starte oder die Konsole schließe:
824ea74048a5fa805c6ef2ea52f0d819


----------



## DerSchokoBär (8. Nov 2012)

Nachtrag: Gebe ich den Hash intern im C-Code aus, ist es derselbe.


----------



## Marco13 (8. Nov 2012)

Ich weiß zwar nicht, was da gemacht wird, aber bei
MD5Update (&mdContext, inString, len);
sollte mit an Wahrscheinlichkeit grenzender Sicherheit
MD5Update (&mdContext, nativeString, len);
stehen...


----------



## mjdv (8. Nov 2012)

Habe es auf meinem Rechner jetzt mal probiert. Bei mir geht es. Vielleicht mal den gesamten Code herzeigen.

EDIT: @Marco13: Ja, sollte es auf jedenfall!
Das wird wohl auch schon das Problem sein, bist du sicher das die Ausgaben im C-Code stimmen? Bei mir zeigt übrigens Eclipse auch den Output aus dem C Code an.


----------



## DerSchokoBär (8. Nov 2012)

Danke ihr beiden, läuft jetzt! 
Was meint ihr performancetechnisch, sollte ich nur das hashen in C auslagern oder doch den gesamten logischen Vorgang? Da es ein Brute Force Programm werden soll, ging es mir um die Performance den Hashvorgang in C auszulagern.
Da Stringvergleiche ziemlich performanceeinbüßend sind, welche effektiveren Methoden stehen mir zur Verfügung?


----------



## Marco13 (8. Nov 2012)

Mal ganz quer geschossen: Wenn das irgendwas Brute-Force-Artiges werden soll, und irgendwie daten-parallel ist (das weiß ich nicht) könnte man OpenCL in Erwägung ziehen. Aber dazu müßte man genauer wissen, worum es geht, und wie die Abläufe sind.


----------



## DerSchokoBär (8. Nov 2012)

Geplant ist ein "Brute Force Hasher". Ein Programm dem ein Hash übergeben wird und er am Ende die ursprüngliche Eingabe herausgeben soll. Dabei soll die Möglichkeit existieren anzugeben wie viele Zeichen das Passwort beinhaltet oder Bruchstücke mitgeben wie "**tier**". Über das parallel arbeiten habe ich mir auch schon Gedanken gemacht, das wollte ich allerdings erst zum Schluss implementieren.


----------



## trööhööt (9. Nov 2012)

ich drücke es mal so aus : ein hash hat eine feste länge ... ergo gibt es für jeden input dieser länge auch einen festen output ... (auch "kleinerer" input hat mindestens die länge des hashes > padding) alles was länge des hashes +1 bit lang ist belegt somit einen output den es bereits gibt ...
darum spricht man bei hashes auch von kollisionen ... (wobei .. wer heute noch MD5 nutzt ist selbst schuld ... SHA512 ist stand der technik)

vereinfacht gesagt : berechne einmal alle MD5 von 00000000 00000000 00000000 00000000 bis 11111111 11111111 11111111 11111111 und speichere diese ... dürfte sich um die 30GB drehen da du ja sowohl input als auch output als paar speichern musst ..

dann hast du eine sog. rainbow-tabelle ... und kannst in dieser jeden hash nachlesen und dir einen dazu passenden input ausgeben lassen ...
ob dabei der input dann natürlich aus druckbaren zeichen besteht oder auch aus zeichen unterhalb von 0x20 dürfte der knackpunkt sein wenn man damit noch was sinnvolles anstellen will ...

ansonsten natürlich einfach die tabelle soange erweitern bis für jeden output mindestens ein input aus druckbaren zeichen vorhanden ist


----------



## trööhööt (9. Nov 2012)

hups ... md5 waren ja 128bit ... naja ... dann brauchst du halt n bisschen mehr platten platz ...


----------



## DerSchokoBär (9. Nov 2012)

Ich weiß was eine Rainbow Table ist, allerdings ging es mir darum noch gar nicht. Dieses Feature wollte ich danach hinzufügen. Deshalb ist die Frage der Effizienz und der Perfomance immer noch nicht gelöst.


----------



## DerSchokoBär (14. Nov 2012)

Hallo zusammen,

ich hab jetzt den gesamten SHA1-Algorithmus in C geschrieben. Der Code sieht wie folgt aus:

```
char *SHA1InterHash(char *tempString)
{
	SHA_CTX sha;
   //const char *nativeString = ;
   unsigned int len = strlen (tempString);   

	SHAInit(&sha);
	SHAUpdate(&sha, tempString, len);
	SHAFinal(digest, &sha);

   //char p[41] = {0};
   char *p = malloc(41);
   int i,j;
	for (i = j = 0; i < 20; ++i,j+=2)
	{
		//if ((i % 4) == 0) printf(" ");
		//printf("%02x", digest[i]);
      sprintf(p+j, "%02x", digest[i]);
	}

   return p;
}


#define MAX_LENGTH 8
char anfangBuchstabe = 'a'; // = 'a'
char endBuchstabe = 'z'; // = 'z'
char cg[MAX_LENGTH] = {0};      // Current Guess
char currentChar = {0};
int index; 

void increment() {
      //index = cg.length - 1; // aktuelle Länge vom aktuellen Char -1
      index = strlen(cg) - 1;  // hier könnte ein Fehler liegen
      while(index >= 0) {
          if (cg[index] == endBuchstabe) { //fragt ob der aktuelle Buchstabe gleich dem letzten Buchstaben ist also z
                      if (index == 0) {
                              //cg = new char[cg.length+1];
                              strncat(cg, "a", 1);
                              int tempIndex = strlen(cg);
                              //Arrays.fill(cg, anfangBuchstabe);    
                              int i;                          
                              for(i=0; i<tempIndex; i++) {
                                 cg[i] = 'a';
                              }
                              cg[0] = anfangBuchstabe;
                              break;
                      } else {
                              cg[index] = anfangBuchstabe;
                              currentChar = cg[--index];
                      }
              } else {
                      currentChar = cg[index];
                      cg[index] = ++currentChar;
                      break;  
              }
      }
}


JNIEXPORT jstring JNICALL Java_main_DLLAufrufen_SHA1main(JNIEnv * env, jclass myclass, jstring inString)
{
   const char *nativeString = (*env)->GetStringUTFChars(env, inString, 0);
   cg[0] = anfangBuchstabe;
   char *attempt = malloc(41);
   attempt = SHA1InterHash(cg);
   //printf("\n%s %s", cg, attempt); 
   while (1) {
      if (strcmp(attempt, nativeString) == 0) {
         printf("Password Found: %s", cg);
         return (*env)->NewStringUTF(env, cg);
      }
      increment();
      attempt = SHA1InterHash(cg);
      //printf("\n%s %s", cg, attempt); 
   }
}
```

Das klappt auch soweit ganz gut. Allerdings wenn ich mehr als 5 Zeichen hashen lasse und den Hash dann über ein kleines Java-Programm übergebe, dass nur die SHA1main aufruft, bekomme ich nach ca. 2 Minuten (genauer gesagt 135 Sekunden) einen Fehler:


```
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77c42332, pid=764, tid=2004
#
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) Client VM (21.0-b17 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [msvcrt.dll+0x32332]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Documents and Settings\tg\My Documents\NetBeansProjects\DLLAufrufen\hs_err_pid764.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
```

So sieht dann das erzeugte Logfile aus:

```
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77c42332, pid=5636, tid=5296
#
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) Client VM (21.0-b17 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [msvcrt.dll+0x32332]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x003c7000):  JavaThread "main" [_thread_in_native, id=5296, stack(0x00900000,0x00950000)]

siginfo: ExceptionCode=0xc0000005, writing address 0x00000002

Registers:
EAX=0x0094f963, EBX=0x0094fbae, ECX=0x0094fbd8, EDX=0x00000002
ESP=0x0094f938, EBP=0x0094f944, ESI=0x0094f998, EDI=0x0094fbd8
EIP=0x77c42332, EFLAGS=0x00010202

Top of Stack: (sp=0x0094f938)
0x0094f938:   77c423ac 00000000 00000008 0094fbbc
0x0094f948:   77c42d17 00000001 003c7000 00000002
0x0094f958:   32a09a88 00002000 0094fb8c 7c90e920
0x0094f968:   00000000 00000007 00000000 00000027
0x0094f978:   00000000 00000000 00000000 00000002
0x0094f988:   0094fbd8 66585004 00000000 37480250
0x0094f998:   00000000 00000002 0094fbae fffffffe
0x0094f9a8:   0094fc0c 00000008 00000000 22a1b5e8 

Instructions: (pc=0x77c42332)
0x77c42312:   e8 64 96 ff ff 59 59 c3 cc cc cc cc cc f6 41 0c
0x77c42322:   40 74 06 83 79 08 00 74 24 ff 49 04 78 0b 8b 11
0x77c42332:   88 02 ff 01 0f b6 c0 eb 0c 0f be c0 51 50 e8 18
0x77c42342:   c9 ff ff 59 59 83 f8 ff 75 03 09 06 c3 ff 06 c3 


Register to memory mapping:

EAX=0x0094f963 is pointing into the stack for thread: 0x003c7000
EBX=0x0094fbae is pointing into the stack for thread: 0x003c7000
ECX=0x0094fbd8 is pointing into the stack for thread: 0x003c7000
EDX=0x00000002 is an unknown value
ESP=0x0094f938 is pointing into the stack for thread: 0x003c7000
EBP=0x0094f944 is pointing into the stack for thread: 0x003c7000
ESI=0x0094f998 is pointing into the stack for thread: 0x003c7000
EDI=0x0094fbd8 is pointing into the stack for thread: 0x003c7000


Stack: [0x00900000,0x00950000],  sp=0x0094f938,  free space=318k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)

[error occurred during error reporting (printing native stack), id 0xc0000005]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  main.DLLAufrufen.SHA1main(Ljava/lang/String;)Ljava/lang/String;+0
j  main.DLLAufrufen.main([Ljava/lang/String;)V+10
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x02c07400 JavaThread "Service Thread" daemon [_thread_blocked, id=4644, stack(0x02e40000,0x02e90000)]
  0x02c01800 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=4052, stack(0x02df0000,0x02e40000)]
  0x02bffc00 JavaThread "Attach Listener" daemon [_thread_blocked, id=4716, stack(0x02da0000,0x02df0000)]
  0x02bfe800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=5608, stack(0x02d50000,0x02da0000)]
  0x02bf8000 JavaThread "Finalizer" daemon [_thread_blocked, id=5176, stack(0x02d00000,0x02d50000)]
  0x02bf3400 JavaThread "Reference Handler" daemon [_thread_blocked, id=3044, stack(0x02cb0000,0x02d00000)]
=>0x003c7000 JavaThread "main" [_thread_in_native, id=5296, stack(0x00900000,0x00950000)]

Other Threads:
  0x02bf1800 VMThread [stack: 0x02c60000,0x02cb0000] [id=5720]
  0x02c12400 WatcherThread [stack: 0x02e90000,0x02ee0000] [id=5328]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
 def new generation   total 4928K, used 305K [0x229f0000, 0x22f40000, 0x27f40000)
  eden space 4416K,   6% used [0x229f0000, 0x22a3c528, 0x22e40000)
  from space 512K,   0% used [0x22e40000, 0x22e40000, 0x22ec0000)
  to   space 512K,   0% used [0x22ec0000, 0x22ec0000, 0x22f40000)
 tenured generation   total 10944K, used 0K [0x27f40000, 0x289f0000, 0x329f0000)
   the space 10944K,   0% used [0x27f40000, 0x27f40000, 0x27f40200, 0x289f0000)
 compacting perm gen  total 12288K, used 103K [0x329f0000, 0x335f0000, 0x369f0000)
   the space 12288K,   0% used [0x329f0000, 0x32a09f38, 0x32a0a000, 0x335f0000)
    ro space 10240K,  45% used [0x369f0000, 0x36e71888, 0x36e71a00, 0x373f0000)
    rw space 12288K,  54% used [0x373f0000, 0x37a704f8, 0x37a70600, 0x37ff0000)

Code Cache  [0x00980000, 0x009f0000, 0x02980000)
 total_blobs=135 nmethods=6 adapters=63 free_code_cache=32327Kb largest_free_block=33103232

Dynamic libraries:
0x00400000 - 0x0042e000 	C:\Program Files\Java\jdk1.7.0\bin\java.exe
0x7c900000 - 0x7c9b2000 	C:\WINDOWS\system32\ntdll.dll
0x7c800000 - 0x7c8f6000 	C:\WINDOWS\system32\kernel32.dll
0x77dd0000 - 0x77e6b000 	C:\WINDOWS\system32\ADVAPI32.dll
0x77e70000 - 0x77f03000 	C:\WINDOWS\system32\RPCRT4.dll
0x77fe0000 - 0x77ff1000 	C:\WINDOWS\system32\Secur32.dll
0x7e410000 - 0x7e4a1000 	C:\WINDOWS\system32\USER32.dll
0x77f10000 - 0x77f59000 	C:\WINDOWS\system32\GDI32.dll
0x773d0000 - 0x774d3000 	C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\COMCTL32.dll
0x77c10000 - 0x77c68000 	C:\WINDOWS\system32\msvcrt.dll
0x77f60000 - 0x77fd6000 	C:\WINDOWS\system32\SHLWAPI.dll
0x76390000 - 0x763ad000 	C:\WINDOWS\system32\IMM32.DLL
0x78aa0000 - 0x78b5e000 	C:\Program Files\Java\jdk1.7.0\jre\bin\msvcr100.dll
0x6da80000 - 0x6dda1000 	C:\Program Files\Java\jdk1.7.0\jre\bin\client\jvm.dll
0x71ad0000 - 0x71ad9000 	C:\WINDOWS\system32\WSOCK32.dll
0x71ab0000 - 0x71ac7000 	C:\WINDOWS\system32\WS2_32.dll
0x71aa0000 - 0x71aa8000 	C:\WINDOWS\system32\WS2HELP.dll
0x76b40000 - 0x76b6d000 	C:\WINDOWS\system32\WINMM.dll
0x76bf0000 - 0x76bfb000 	C:\WINDOWS\system32\PSAPI.DLL
0x6da10000 - 0x6da1c000 	C:\Program Files\Java\jdk1.7.0\jre\bin\verify.dll
0x6d480000 - 0x6d4a0000 	C:\Program Files\Java\jdk1.7.0\jre\bin\java.dll
0x6da60000 - 0x6da73000 	C:\Program Files\Java\jdk1.7.0\jre\bin\zip.dll
0x64300000 - 0x64309000 	C:\Documents and Settings\xxx\My Documents\NetBeansProjects\DLLAufrufen\dllmain.dll
0x66580000 - 0x6658a000 	C:\Documents and Settings\xxx\My Documents\NetBeansProjects\DLLAufrufen\SHA1DLL.dll

VM Arguments:
jvm_args: -Dfile.encoding=UTF-8 
java_command: main.DLLAufrufen
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=C:\Program Files\Java\jdk1.7.0\
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\IVI Foundation\VISA\WinNT\Bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Common Files\SYSTEM\MSMAPI\1033;C:\Program Files\jEdit; C:\Program Files\Java\jdk1.6.0_21\bin;C:\Program Files\Java\jdk1.6.0_21\bin
USERNAME=tg
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 6, GenuineIntel



---------------  S Y S T E M  ---------------

OS: Windows XP Build 2600 Service Pack 3

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 23 stepping 6, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1

Memory: 4k page, physical 3098340k(5384k free), swap 5504964k(427700k free)

vm_info: Java HotSpot(TM) Client VM (21.0-b17) for windows-x86 JRE (1.7.0-b147), built on Jun 27 2011 02:25:52 by "java_re" with unknown MS VC++:1600

time: Wed Nov 14 14:45:03 2012
elapsed time: 135 seconds
```

Anscheinend gibt es irgendein Problem mit der Speicherverwaltung, in C bin ich auch nicht so fit, vielleicht habe ich irgendwo nicht genügend Speicher reserviert.

Danke schon im Voraus
DerSchokoBär


----------



## mjdv (14. Nov 2012)

So als erster Tipp, du hast vergessen den nativeString wieder zu releasen.

EDIT: und du free'st den attempt char* nicht. Du erzeugst mit jedem Funktionsaufruf einen neuen mit malloc und machst kein free!
Am besten gibst du der Funktion SHA1InterHash attemp als Parameter mit wo das Ergebnis dann rein gespeichert wird. Mach dann den Rückgabetyp zu void;


----------



## DerSchokoBär (14. Nov 2012)

Stimmt, werde ich noch hinzufügen. Ist das denn wirklich so nötig? In Wikipedia steht jedenfalls, dass man das unbedingt machen sollte.

Meinst du nicht char *p? Die SHA1main wird ja nur einmal aufgerufen, ergo wird für attempt auch nur einmal Speicher reserviert. Dieser reserviert bei jedem Aufruf Speicher. Wird dieser aber nicht wieder freigegeben, sobald die Funktion verlassen wird, da die Variable lokal ist? Habe das jetzt wie folgt geändert:


```
char *p; // global

char *SHA1InterHash(char *tempString)
{
   ...
   p = malloc(41 * sizeof(char));
   ...
}
```

Das Programm crasht aber immer noch bei einem Hash von mehr als 5 Zeichen.


----------



## mjdv (14. Nov 2012)

DerSchokoBär hat gesagt.:


> Stimmt, werde ich noch hinzufügen. Ist das denn wirklich so nötig? In Wikipedia steht jedenfalls, dass man das unbedingt machen sollte.
> 
> Meinst du nicht char *p? Die SHA1main wird ja nur einmal aufgerufen, ergo wird für attempt auch nur einmal Speicher reserviert. Dieser reserviert bei jedem Aufruf Speicher. Wird dieser aber nicht wieder freigegeben, sobald die Funktion verlassen wird, da die Variable lokal ist? Habe das jetzt wie folgt geändert:
> 
> ...



Du hast mich nicht ganz verstanden. Lass dir mal sizeof(char) ausgeben.

In der Funktion SHA1InterHash liegt das Problem! Hier reservierst du immer neuen Speicher, gibst ihn als Pointer zurück und free'st ihn dann nicht mehr! Ob das jetzt erst p oder dann später in sha1main attempt heißt ist völlig egal. Und ja das ist sehr wichtig, weil du immer neuen Speicher holst per malloc und wahrscheinlich nicht unendlich davon hast. Als Faustregel gilt, zu jedem malloc ein free.

In diesem Fall kannst du malloc eh komplett vermeiden.

Du solltest in SHA1InterHash keine Speicher reservieren.

Ich würds ugf so machen: (Ungetestet!)


```
void SHA1InterHash(char *tempString, char *p)
{
	SHA_CTX sha;
   //const char *nativeString = ;
   unsigned int len = strlen (tempString);   

	SHAInit(&sha);
	SHAUpdate(&sha, tempString, len);
	SHAFinal(digest, &sha);

   
   // WICHITG: p muss richtige Länge haben!
   int i,j;
	for (i = j = 0; i < 20; ++i,j+=2)
	{
		
      sprintf(p+j, "%02x", digest[i]);
	}

}

JNIEXPORT jstring JNICALL Java_main_DLLAufrufen_SHA1main(JNIEnv * env, jclass myclass, jstring inString)
{
   const char *nativeString = (*env)->GetStringUTFChars(env, inString, 0);
   cg[0] = anfangBuchstabe;
   char attempt[41];
   attempt = SHA1InterHash(cg, attempt);
   //printf("\n%s %s", cg, attempt); 
   while (1) {
      if (strcmp(attempt, nativeString) == 0) {
         printf("Password Found: %s", cg);
         return (*env)->NewStringUTF(env, cg);
      }
      increment();
      SHA1InterHash(cg, attempt);
      //printf("\n%s %s", cg, attempt); 
   }
}
```

Generell, solltest du dich mal mit den Grundlagen auseinandersetzen.


----------



## DerSchokoBär (14. Nov 2012)

> Generell, solltest du dich mal mit den Grundlagen auseinandersetzen.


Werde ich auf jeden Fall noch zu einem späteren Zeitpunkt machen, allerdings sollte das ja sowieso ein Java-Projekt werden und nur aus Performancegründen wollte ich die Rechnungen in C umsetzen.



> Lass dir mal sizeof(char) ausgeben.


Sollte 1 zurückgeben, habe aber gelesen, dass es sich hier um einen besseren Stil handelt.


```
...
   char attempt[41];
   attempt = SHA1InterHash(cg, attempt);
...
```
Habe es korrigiert und funktioniert jetzt, vielen Dank!
Hättest du noch Performancetipps à la lieber i++ verwenden statt i = i +1, da schneller? Das ganze wird ja millionen mal iteriert, d.h. jeder kleine Aufruf den man vermeidet bringt Performancevorteile.


----------



## tröööt (15. Nov 2012)

kenne mich zwar mit C nicht aus ... würde aber sagen das auch unter C ein char 16bit = 2byte groß ist womit die ausgabe sizeof(char) also "2" sein sollte ...

was die performance angeht
sicher dürfte java im vergleich zu ner nativen implementierung hinten liegen ... allerdings gewinnt auch eine reine java-implementierung danke JIT-compiling mit der zeit an speed ... denn irgendwann wurde der code soweit optimiert und in native-code übersetzt das es wohl schwer sein dürfte einen noch optimierteren und noch saubereren native-code zu schreiben ... und wenn dürften die unterschiede nur sehr gering ausfallen ...
von daher würde ich weiterhin sagen : lass die arbeit einfach durch die "Digest" klasse erledigen ...


nur noch so nebenbei mal speicherverbrauch (gerechnet mit 2x 128bit (input + hash))

(((2^128)*32)*2) = 19807040628566084398385987584 TB

um also von MD5 eine vollständige rainbow-table zu erstellen bräuchtest du unvorstellbar viel speicher ...
mag sein das man auf so viel kommt wenn man mehrere komplette rechenzentren vernetzt ... aber als privat person dürfte das unmöglich werden ... selbst wenn man es ausdruckt und sich damit die wand tapeziert ...


----------



## mjdv (15. Nov 2012)

Das ist leider falsch. Erstens kommt das auf den Prozessor an und zweitens ist der char auf einem normalen 32 bit Intel Prozessor 1 Byte groß. Ist Also eher äquivalent zu byte in Java ( wenn man das überhaupt so sagen kann.)


@DerSchokoBär

Ja stimmt das ist besserer Stil und sogar unabdibglich wenn dein C Code möglichst portabel sein soll (zB 64bit).

Ich wollte dir ja nur zeigen, dass diese Änderung natürlich am verhalten des Programms gar nichts ändert.


----------



## DerSchokoBär (15. Nov 2012)

Also ich bedanke mich 

@tröööt:
Nur so als Richtwerte, das waren keine präzisen Messungen und auch nicht professionell durchgeführt. Für einen gehashten "zzzzz" String (ca. 11,8 Mio. Möglichkeiten) benötigte die Programmversion:
- in der alles in C implementiert war: ca. 46 Sekunden
- in der nur das Hashing in C implementiert war: ca. 58 Sekunden
- in der alles in Java umgesetzt wurde: ca. 1 Minute 51 Sekunden
d.h. ganz grob ich konnte eine Performancesteigerung von mehr als 100% erzielen.


----------



## Marco13 (15. Nov 2012)

Hast du eine Kleine, Compilierbare (nachvollziehbare) plain-Java-Version, die du hier posten könntest?


----------



## DerSchokoBär (15. Nov 2012)

Klein ist relativ...
Die GUI habe ich mittels NetBeans erstellt, nachvollziehbar sollte es sein, wenn nicht einfach nachfragen. Der eigentliche Aufruf erfolgt über die private "void hashButton1ActionPerformed" (HashGeneratorUI (2/2)". Nicht wundern das ist Englisch und Deutsch gemischt, nicht die endgültige Version und ebenfalls ist dort der Versuch enthalten eine erwartete Zeit formatiert auszugeben...
Alle DLL-Aufrufe habe ich rausgenommen.

Teil 1 (kann nur bis zu 25000 Zeichen posten)
Klasse HashGeneratorUI (1/2):

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.filechooser.FileNameExtensionFilter;


/**
 *
 * @author DerSchokoBär
 */
public class HashGeneratorUI extends javax.swing.JFrame {
    //public native static void MDString("test");
    
    
    public HashGeneratorUI() {
        initComponents();
        FileNameExtensionFilter filter=new FileNameExtensionFilter("Zip Archive: *.zip","zip");
        jFileChooserT2N1.setAcceptAllFileFilterUsed(false);   
        jFileChooserT2N1.addChoosableFileFilter(filter);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        buttonGroup2 = new javax.swing.ButtonGroup();
        buttonGroup3 = new javax.swing.ButtonGroup();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        clearButton1 = new javax.swing.JButton();
        hashButton1 = new javax.swing.JButton();
        exitButton = new javax.swing.JButton();
        jPanel4 = new javax.swing.JPanel();
        jLabelT1N3 = new javax.swing.JLabel();
        jRadioButtonT1N1SHA = new javax.swing.JRadioButton();
        jRadioButtonT1N2MD = new javax.swing.JRadioButton();
        jLabelT1N4 = new javax.swing.JLabel();
        jComboBoxT1N1 = new javax.swing.JComboBox();
        jLabelT1N5 = new javax.swing.JLabel();
        jComboBoxT1N3 = new javax.swing.JComboBox();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jComboBoxT1N2 = new javax.swing.JComboBox();
        jPanel5 = new javax.swing.JPanel();
        jTextFieldT1N1 = new javax.swing.JTextField();
        jLabelT1N1 = new javax.swing.JLabel();
        jLabelT1N2 = new javax.swing.JLabel();
        jTextFieldT1N2 = new javax.swing.JTextField();
        jPanel6 = new javax.swing.JPanel();
        jProgressBar1 = new javax.swing.JProgressBar();
        jLabelT1N6 = new javax.swing.JLabel();
        jLabelT1N7 = new javax.swing.JLabel();
        jLabelT1N8 = new javax.swing.JLabel();
        jLabelT1N9 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jFileChooserT2N1 = new javax.swing.JFileChooser();
        jPanel8 = new javax.swing.JPanel();
        jLabelT2N1 = new javax.swing.JLabel();
        jTextField3 = new javax.swing.JTextField();
        jLabelT2N2 = new javax.swing.JLabel();
        jRadioButtonT2N1 = new javax.swing.JRadioButton();
        jRadioButtonT2N2 = new javax.swing.JRadioButton();
        jComboBoxT2N1 = new javax.swing.JComboBox();
        jPanel2 = new javax.swing.JPanel();
        jPanel9 = new javax.swing.JPanel();
        jTextFieldT3N1 = new javax.swing.JTextField();
        jLabelT3N1 = new javax.swing.JLabel();
        jLabelT3N2 = new javax.swing.JLabel();
        jTextFieldT3N2 = new javax.swing.JTextField();
        jPanel7 = new javax.swing.JPanel();
        jLabelT3N3 = new javax.swing.JLabel();
        jRadioButtonT1N1 = new javax.swing.JRadioButton();
        jRadioButtonT3N2 = new javax.swing.JRadioButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        clearButton1.setText("Clear");
        clearButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearButton1ActionPerformed(evt);
            }
        });

        hashButton1.setText("Hash");
        hashButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                hashButton1ActionPerformed(evt);
            }
        });

        exitButton.setText("Exit");
        exitButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitButtonActionPerformed(evt);
            }
        });

        jPanel4.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT1N3.setText("Algorithmus");

        buttonGroup1.add(jRadioButtonT1N1SHA);
        jRadioButtonT1N1SHA.setSelected(true);
        jRadioButtonT1N1SHA.setText("SHA1");
        jRadioButtonT1N1SHA.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonT1N1SHAActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButtonT1N2MD);
        jRadioButtonT1N2MD.setText("MD5");
        jRadioButtonT1N2MD.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonT1N2MDActionPerformed(evt);
            }
        });

        jLabelT1N4.setText("Passwortlänge");

        jComboBoxT1N1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "3", "4", "5", "6" }));
        jComboBoxT1N1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboBoxT1N1ItemStateChanged(evt);
            }
        });
        jComboBoxT1N1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxT1N1ActionPerformed(evt);
            }
        });

        jLabelT1N5.setText("Char Type Property");

        jComboBoxT1N3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Kleinbuchstaben", "Großbuchstaben", "Klein- und Großbuchstaben", "Zahlen", "Klein- und Großbuchstaben + Zahlen + Sonderzeichen" }));
        jComboBoxT1N3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxT1N3ActionPerformed(evt);
            }
        });

        jLabel1.setText("min.");

        jLabel2.setText("max.");

        jComboBoxT1N2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "3", "4", "5", "6", "7", "8" }));
        jComboBoxT1N2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxT1N2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelT1N4)
                    .addComponent(jLabelT1N3)
                    .addComponent(jLabelT1N5))
                .addGap(20, 20, 20)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jComboBoxT1N3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel4Layout.createSequentialGroup()
                        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jRadioButtonT1N1SHA)
                            .addGroup(jPanel4Layout.createSequentialGroup()
                                .addGap(8, 8, 8)
                                .addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jComboBoxT1N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(31, 31, 31)
                        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel4Layout.createSequentialGroup()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jComboBoxT1N2, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(jRadioButtonT1N2MD))))
                .addContainerGap(36, Short.MAX_VALUE))
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N3)
                    .addComponent(jRadioButtonT1N1SHA)
                    .addComponent(jRadioButtonT1N2MD))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N4)
                    .addComponent(jComboBoxT1N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(jComboBoxT1N2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N5)
                    .addComponent(jComboBoxT1N3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        jPanel5.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT1N1.setText("Hash");

        jLabelT1N2.setText("Text");

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabelT1N1)
                    .addComponent(jLabelT1N2))
                .addGap(18, 18, 18)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextFieldT1N1, javax.swing.GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
                    .addComponent(jTextFieldT1N2))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N1)
                    .addComponent(jTextFieldT1N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldT1N2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelT1N2))
                .addContainerGap(49, Short.MAX_VALUE))
        );

        jPanel6.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT1N6.setText("Total Passwords");

        jLabelT1N8.setText("Estimated Time");

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelT1N6)
                        .addGap(18, 18, 18)
                        .addComponent(jLabelT1N7))
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 384, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelT1N8)
                        .addGap(18, 18, 18)
                        .addComponent(jLabelT1N9)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N6)
                    .addComponent(jLabelT1N7))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT1N8)
                    .addComponent(jLabelT1N9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 23, Short.MAX_VALUE)
                .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(hashButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(clearButton1)
                        .addGap(41, 41, 41)
                        .addComponent(exitButton))
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(57, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(56, 56, 56)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(clearButton1)
                    .addComponent(hashButton1)
                    .addComponent(exitButton))
                .addContainerGap(31, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Hash zurückrechnen", jPanel1);

        jFileChooserT2N1.setFileHidingEnabled(true);
        jFileChooserT2N1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jFileChooserT2N1ActionPerformed(evt);
            }
        });

        jPanel8.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT2N1.setText("Passwort");

        jLabelT2N2.setText("Passwortlänge");

        jRadioButtonT2N1.setText("unbekannt");

        jRadioButtonT2N2.setText("bekannt");

        jComboBoxT2N1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "3", "4" }));

        javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);
        jPanel8.setLayout(jPanel8Layout);
        jPanel8Layout.setHorizontalGroup(
            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel8Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelT2N1)
                    .addComponent(jLabelT2N2, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel8Layout.createSequentialGroup()
                        .addComponent(jRadioButtonT2N1)
                        .addGap(31, 31, 31)
                        .addComponent(jRadioButtonT2N2)
                        .addGap(18, 18, 18)
                        .addComponent(jComboBoxT2N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(226, Short.MAX_VALUE))
        );
        jPanel8Layout.setVerticalGroup(
            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel8Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT2N1)
                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT2N2)
                    .addComponent(jRadioButtonT2N1)
                    .addComponent(jRadioButtonT2N2)
                    .addComponent(jComboBoxT2N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(34, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jFileChooserT2N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addComponent(jFileChooserT2N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
// Fortsetzung folgt
```


----------



## DerSchokoBär (15. Nov 2012)

Teil 2:

Klasse HashGeneratorUI (2/2):

```
jTabbedPane1.addTab("Zip Archive öffnen", jPanel3);

        jPanel9.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT3N1.setText("Text");

        jLabelT3N2.setText("Hash");

        javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);
        jPanel9.setLayout(jPanel9Layout);
        jPanel9Layout.setHorizontalGroup(
            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel9Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabelT3N1)
                    .addComponent(jLabelT3N2))
                .addGap(18, 18, 18)
                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextFieldT3N1, javax.swing.GroupLayout.DEFAULT_SIZE, 336, Short.MAX_VALUE)
                    .addComponent(jTextFieldT3N2))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel9Layout.setVerticalGroup(
            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel9Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT3N1)
                    .addComponent(jTextFieldT3N1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldT3N2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelT3N2))
                .addContainerGap(49, Short.MAX_VALUE))
        );

        jPanel7.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabelT3N3.setText("Algorithmus");

        buttonGroup3.add(jRadioButtonT1N1);
        jRadioButtonT1N1.setText("SHA1");
        jRadioButtonT1N1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonT1N1ActionPerformed(evt);
            }
        });

        buttonGroup3.add(jRadioButtonT3N2);
        jRadioButtonT3N2.setText("MD5");

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelT3N3)
                .addGap(18, 18, 18)
                .addComponent(jRadioButtonT1N1)
                .addGap(18, 18, 18)
                .addComponent(jRadioButtonT3N2)
                .addContainerGap(234, Short.MAX_VALUE))
        );
        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelT3N3)
                    .addComponent(jRadioButtonT1N1)
                    .addComponent(jRadioButtonT3N2))
                .addContainerGap(75, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(69, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(231, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Hasher", jPanel2);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 522, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 498, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jComboBoxT1N1ItemStateChanged(java.awt.event.ItemEvent evt) {                                               
        // TODO add your handling code here:
    }                                              

    private void jRadioButtonT1N2MDActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        // TODO add your handling code here:
    }                                                  

    private void jRadioButtonT1N1SHAActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        // TODO add your handling code here:
    }                                                   

    private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        System.exit(0);
    }                                          

    private void hashButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        HashGenerator hashGenerator = new HashGenerator();
        if(jRadioButtonT1N1SHA.isSelected()) {
            if(hashGenerator.eingabeUepruefenSHA1(jTextFieldT1N1.getText())) {
                try {
                    jTextFieldT1N2.setText(IterationAlgorithmus.bruteForceSHA1(jTextFieldT1N1.getText(), Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()), jComboBoxT1N3.getSelectedIndex()));
                    //jTextFieldT1N2.setText(hashGenerator.makeSHA1DLLHashmain(jTextFieldT1N1.getText()));
                } catch (NoSuchAlgorithmException ex) {
                    Logger.getLogger(HashGeneratorUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else 
                jTextFieldT1N2.setText("Ihre Eingabe entspricht nicht den keinem SHA1 Hash");
        } else if(jRadioButtonT1N2MD.isSelected()) {
            if(hashGenerator.eingabeUepruefenMD5(jTextFieldT1N1.getText())) {
                try {
                    jTextFieldT1N2.setText(IterationAlgorithmus.bruteForceMD5DLL(jTextFieldT1N1.getText(), Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()), jComboBoxT1N3.getSelectedIndex()));
                } catch (NoSuchAlgorithmException ex) {
                    Logger.getLogger(HashGeneratorUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else 
                jTextFieldT1N2.setText("Ihre Eingabe entspricht nicht den keinem MD5 Hash");
        }
    }                                           

    private void clearButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
        jTextFieldT1N1.setText("");
        jTextFieldT1N2.setText("");
    }                                            

    private void jRadioButtonT1N1ActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
    }                                                

    private void jFileChooserT2N1ActionPerformed(java.awt.event.ActionEvent evt) {                                                 
       // multiselectionebabled???
        try {
           jTextField3.setText(IterationAlgorithmus.bruteForceZIP(1, jFileChooserT2N1.getSelectedFile().getAbsolutePath(), Integer.parseInt((String) jComboBoxT1N3.getSelectedItem())));
       } catch (Exception e) {
                e.printStackTrace();
        }
        //jFileChooser1.setFileFilter(filter);
        // TODO add your handling code here:
    }                                                

    private void jComboBoxT1N3ActionPerformed(java.awt.event.ActionEvent evt) {                                              
       
        DecimalFormat df =   new DecimalFormat(",###");
        switch(jComboBoxT1N3.getSelectedIndex()) {
            case 0: // a-z
                jLabelT1N7.setText(""+df.format((long)Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 1: //A-Z
                jLabelT1N7.setText(""+df.format((long)Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 2:
                jLabelT1N7.setText(""+df.format((long)Math.pow(58 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 3:
                jLabelT1N7.setText(""+df.format((long)Math.pow(10 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 4:
                jLabelT1N7.setText(""+df.format((long)Math.pow(95 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
        }
    }                                             

    private void jComboBoxT1N1ActionPerformed(java.awt.event.ActionEvent evt) {                                              
        
        long tempValue;
        DecimalFormat decf =   new DecimalFormat(",###");
        // DateFormat datef = SimpleDateFormat.getTimeInstance("HH:mm:ss"); //DateFormat.MEDIUM
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS");
        Date d;
        switch(jComboBoxT1N3.getSelectedIndex()) {
            case 0: // a-z
                
                tempValue = (long) Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))));
                jLabelT1N7.setText(""+decf.format(tempValue));

                
                d = new Date(System.currentTimeMillis());
                DateFormat df = SimpleDateFormat.getTimeInstance(DateFormat.MEDIUM);
                System.out.println(df.format(d));
                d = new Date(tempValue / 5000000);
                System.out.println("format " + format.format(d));
                
                
                
                break;
            case 1: //A-Z
                tempValue = (long) Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))));
                jLabelT1N7.setText(""+decf.format(tempValue));
                d = new Date(tempValue/ 500);
                System.out.println("date " + d);
                d = new Date(tempValue/ 5000000);
                System.out.println("date " + d);
                System.out.println("format " + format.format(d));
                break;
            case 2:
                tempValue = (long) Math.pow(58 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))));
                jLabelT1N7.setText(""+decf.format(tempValue));

                d = new Date(tempValue/ 500);
                System.out.println("date " + d);
                d = new Date(tempValue/ 5000000);
                System.out.println("date " + d);
                System.out.println("format " + format.format(d));
                break;
            case 3:
                tempValue = (long) Math.pow(10 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))));
                jLabelT1N7.setText(""+decf.format(tempValue));
                d = new Date(tempValue/ 500);
                System.out.println("date " + d);
                d = new Date(tempValue/ 5000000);
                System.out.println("date " + d);
                System.out.println("format " + format.format(d));
                break;
            case 4:
                tempValue = (long) Math.pow(95 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))));
                jLabelT1N7.setText(""+decf.format(tempValue));
                d = new Date(tempValue/ 500);
                System.out.println("date " + d);
                d = new Date(tempValue/ 5000000);
                System.out.println("date " + d);
                System.out.println("format " + format.format(d));
                break;
        }
    }                                             

    private void jComboBoxT1N2ActionPerformed(java.awt.event.ActionEvent evt) {                                              

        DecimalFormat df =   new DecimalFormat(",###");
        switch(jComboBoxT1N3.getSelectedIndex()) {
            case 0: // a-z
                jLabelT1N7.setText(""+df.format((long)Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 1: //A-Z
                jLabelT1N7.setText(""+df.format((long)Math.pow(26 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 2:
                jLabelT1N7.setText(""+df.format((long)Math.pow(58 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 3:
                jLabelT1N7.setText(""+df.format((long)Math.pow(10 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
            case 4:
                jLabelT1N7.setText(""+df.format((long)Math.pow(95 , (Integer.parseInt((String) jComboBoxT1N2.getSelectedItem()) - (Integer.parseInt((String) jComboBoxT1N1.getSelectedItem()))))));
                break;
        }
    }                                             

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * [url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)[/url]
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(HashGeneratorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(HashGeneratorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(HashGeneratorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(HashGeneratorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        
        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new HashGeneratorUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.ButtonGroup buttonGroup2;
    private javax.swing.ButtonGroup buttonGroup3;
    private javax.swing.JButton clearButton1;
    private javax.swing.JButton exitButton;
    private javax.swing.JButton hashButton1;
    private javax.swing.JComboBox jComboBoxT1N1;
    private javax.swing.JComboBox jComboBoxT1N2;
    private javax.swing.JComboBox jComboBoxT1N3;
    private javax.swing.JComboBox jComboBoxT2N1;
    private javax.swing.JFileChooser jFileChooserT2N1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabelT1N1;
    private javax.swing.JLabel jLabelT1N2;
    private javax.swing.JLabel jLabelT1N3;
    private javax.swing.JLabel jLabelT1N4;
    private javax.swing.JLabel jLabelT1N5;
    private javax.swing.JLabel jLabelT1N6;
    private javax.swing.JLabel jLabelT1N7;
    private javax.swing.JLabel jLabelT1N8;
    private javax.swing.JLabel jLabelT1N9;
    private javax.swing.JLabel jLabelT2N1;
    private javax.swing.JLabel jLabelT2N2;
    private javax.swing.JLabel jLabelT3N1;
    private javax.swing.JLabel jLabelT3N2;
    private javax.swing.JLabel jLabelT3N3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel8;
    private javax.swing.JPanel jPanel9;
    private javax.swing.JProgressBar jProgressBar1;
    private javax.swing.JRadioButton jRadioButtonT1N1;
    private javax.swing.JRadioButton jRadioButtonT1N1SHA;
    private javax.swing.JRadioButton jRadioButtonT1N2MD;
    private javax.swing.JRadioButton jRadioButtonT2N1;
    private javax.swing.JRadioButton jRadioButtonT2N2;
    private javax.swing.JRadioButton jRadioButtonT3N2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextFieldT1N1;
    private javax.swing.JTextField jTextFieldT1N2;
    private javax.swing.JTextField jTextFieldT3N1;
    private javax.swing.JTextField jTextFieldT3N2;
    // End of variables declaration
}
```


----------



## DerSchokoBär (15. Nov 2012)

Teil 3:

Klasse HashGenerator:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 *
 * @author DerSchokoBär
 */
public class HashGenerator {
    
    public boolean eingabeUepruefenMD5(String input) {
        if(input.length() != 32) {
            System.out.println("eingabeUeberpruefen: unter 32 zeichen");
            return false;
        }
        else { 
                Pattern p = Pattern.compile("\\w+");
                Matcher m = p.matcher(input);
                if(m.matches()) {
                    //System.out.println("regex true");
                    return true;
                } else {
                    //System.out.println("regex false");
                    return false;
                } 
        }
    }
    
    public boolean eingabeUepruefenSHA1(String input) {
        if(input.length() != 40) {
            System.out.println("eingabeUeberpruefen: unter 40 zeichen");
            return false;
        }
        else { 
                Pattern p = Pattern.compile("\\w+");
                Matcher m = p.matcher(input);
                if(m.matches()) {
                    //System.out.println("regex true");
                    return true;
                } else {
                    //System.out.println("regex false");
                    return false;
                } 
        }
    }
    
    public String makeMD5Hash(String input) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("MD5");
                       
            md.reset();
            byte[] buffer = input.getBytes();
            md.update(buffer);
            byte[] digest = md.digest();

            String hexStr = "";
            for (int i = 0; i < digest.length; i++) {
                hexStr +=  Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 );
            }
            return hexStr;
    }
    
    public String makeSHA1Hash(String input) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("SHA1");
                       
            md.reset();
            byte[] buffer = input.getBytes();
            md.update(buffer);
            byte[] digest = md.digest();

            String hexStr = "";
            for (int i = 0; i < digest.length; i++) {
                hexStr +=  Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 );
            }
            return hexStr;
    }
}
```


Klasse IterationAlgorithmus:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 *
 * @author DerSchokoBär
 */
public class IterationAlgorithmus {
 
    /**
     * @param args the command line arguments
     */
    
   private static char anfangBuchstabe;
   private static char endBuchstabe; 
   private static char[] cg;      // Current Guess
   private static char currentChar;
   private static int index; 
   
   // 0. Kleinbuchstaben
   // 1. Großbuchstaben
   // 2. Klein- und Großbuchstaben
   // 3. Zahlen
   // 4. Klein- und Großbuchstaben + Zahlen + Sonderzeichen
    
   public static String bruteForceSHA1(final String hash, final int passwLength, final int setting) throws NoSuchAlgorithmException {
        HashGenerator hashGenerator = new HashGenerator();

        switch(setting) {
            case 0: // Kleinbuchstaben
                anfangBuchstabe = 'a';
                endBuchstabe = 'z';
                break;
            case 1: // Großbuchstaben
                anfangBuchstabe = 'A';
                endBuchstabe = 'Z';
                break;
            case 2: // Klein-und Großbuchstaben. Anmerkung: Sonderzeichen im ASCII Code dazwischen
                anfangBuchstabe = 'A';
                endBuchstabe = 'z';
                break;
            case 3: // Zahlen
                anfangBuchstabe = '1';
                endBuchstabe = '9';
                break;
            case 4: // Klein- und Großbuchstaben + Zahlen + Sonderzeichen
                anfangBuchstabe = ' '; // ASCII 32
                endBuchstabe = '~'; // ASCII 126
                break;
        }
        
        cg = new char[passwLength];
        Arrays.fill(cg, anfangBuchstabe);

        String attempt = hashGenerator.makeMD5Hash(String.valueOf(cg));
        while (true) {
                if (attempt.equals(hash)) {
                        System.out.println("Password Found: " + attempt);
                        return String.valueOf(cg);
                }
                increment();
                attempt = hashGenerator.makeSHA1Hash(String.valueOf(cg));
        }
   }
   
   public static String bruteForceMD5(final String hash, final int passwLength, final int setting) throws NoSuchAlgorithmException {
        HashGenerator hashGenerator = new HashGenerator();
        
        switch(setting) {
            case 0: // Kleinbuchstaben
                anfangBuchstabe = 'a';
                endBuchstabe = 'z';
                break;
            case 1: // Großbuchstaben
                anfangBuchstabe = 'A';
                endBuchstabe = 'Z';
                break;
            case 2: // Klein-und Großbuchstaben. Anmerkung: Sonderzeichen im ASCII Code dazwischen
                anfangBuchstabe = 'A';
                endBuchstabe = 'z';
                break;
            case 3: // Zahlen
                anfangBuchstabe = '1';
                endBuchstabe = '9';
                break;
            case 4: // Klein- und Großbuchstaben + Zahlen + Sonderzeichen
                anfangBuchstabe = ' '; // ASCII 32
                endBuchstabe = '~'; // ASCII 126
                break; 
        }
        
        cg = new char[passwLength];
        Arrays.fill(cg, anfangBuchstabe);

        String attempt = hashGenerator.makeMD5Hash(String.valueOf(cg));
        while (true) {
                if (attempt.equals(hash)) {
                        System.out.println("Password Found: " + attempt);
                        return String.valueOf(cg);
                }
                increment();
                attempt = hashGenerator.makeMD5Hash(String.valueOf(cg));
        }
   }

   private static void increment() {
            index = cg.length - 1; // aktuelle Länge vom aktuellen Char -1
            while(index >= 0) {
                if (cg[index] == endBuchstabe) { //fragt ob der aktuelle Buchstabe gleich dem letzten Buchstaben ist also z
                            if (index == 0) {
                                    cg = new char[cg.length+1];
                                    Arrays.fill(cg, anfangBuchstabe);
                                    break;
                            } else {
                                    cg[index] = anfangBuchstabe;
                                    //index--;
                                    currentChar = cg[--index];
                            }
                    } else {
                            currentChar = cg[index];
                            cg[index] = ++currentChar;
                            break;  
                    }
            }
    }
}
```


----------



## mjdv (15. Nov 2012)

Du kannst auch zip Archive hochladen


----------



## DerSchokoBär (15. Nov 2012)

gesagt, getan.
Edit: Der Code muss aber noch angepasst werden. In der "void hashButton1ActionPerformed" wird aktuell auf die Methode, die die DLL aufruft zuegegriffen, das muss noch rausgenommen werden und das andere auskommentiert werden, zudem können die DLLs nicht gefunden werden, also die entsprechenden Passagen in der HashGenerator und der IterationAlgorithmus löschen.


----------



## tröööt (16. Nov 2012)

mjdv hat gesagt.:


> Das ist leider falsch. Erstens kommt das auf den Prozessor an und zweitens ist der char auf einem normalen 32 bit Intel Prozessor 1 Byte groß. Ist Also eher äquivalent zu byte in Java ( wenn man das überhaupt so sagen kann.)



gut .. wusste ich nicht das "char" unter C ein 8-bit datentyp ist ... kenne halt nur den java-typen für 16bit unicode-zeichen

@TO
hmm ... gut ... das macht dann schon einen unterschied ... und ich würde sogar davon ausgehen das sich diese verhältnis bis 2^128 nur wenig ändern dürfte ... dann ist der JIT-compiler doch nicht so super ...


----------



## Marco13 (16. Nov 2012)

Kann man das auf ein

```
class Hash
{
    public static void main(String args[])
    {
        String input = "...";
        runThatThingThatTakesSoLong(input);
    }

    private static void runThatThingThatTakesSoLong(String input)
    {
    }
}
```
zusammenstutzen, bei dem man erkennt, WAS da eigentlich so lange dauert?


----------

