Forum: PC-Programmierung Wo gibt es eine gute Hashfunktion für NTLM (C#)


von NTLM Hashfunktion in C# (Gast)


Lesenswert?

Hallo,

ich arbeite gerade an einem Programm an der Schule es geht um 
Einwegfunktionen mit C#. Ich suche schon länger vergeblich nach einer 
NTLM-Einwegfunktion.

Hat jemand den passenden Code gerade da oder kennt jemand einen Link?

Mfg

Sebastian Neusch

von Arc N. (arc)


Lesenswert?

NTLM Hashfunktion in C# schrieb:
> Hallo,
>
> ich arbeite gerade an einem Programm an der Schule es geht um
> Einwegfunktionen mit C#. Ich suche schon länger vergeblich nach einer
> NTLM-Einwegfunktion.
>
> Hat jemand den passenden Code gerade da oder kennt jemand einen Link?
>
> Mfg
>
> Sebastian Neusch

NTLM sollte nicht mehr verwendet werden, u.a. da es keine brauchbaren 
kryptographischen Funktionen unterstützt.
Ansonsten
NTLM v1 Authentication
http://msdn.microsoft.com/en-us/library/cc236699.aspx
NTLM v2 Authentication
http://msdn.microsoft.com/en-us/library/cc236700.aspx
oder
http://en.wikipedia.org/wiki/Cryptographic_hash_function

von NTLM Hashfunktion in C# (Gast)


Lesenswert?

Vielen Dank,

welche dieser Versionen wird bei Windows 7 verwendet.

Mfg

von PTC/NTC Physikalische Funktionsweise (Gast)


Lesenswert?

und ich meinte eig. auch für c# und nicht vb

von Εrnst B. (ernst)


Lesenswert?

PTC/NTC Physikalische Funktionsweise schrieb:
> und ich meinte eig. auch für c# und nicht vb

Das ist auch kein VB, das ist "Pseudocode", und der ist extra so 
geschrieben dass man ihn leicht in die Programmiersprache seiner Wahl 
übersetzen kann...


z.B:
1
Define NTOWFv2(Passwd, User, UserDom) as HMAC_MD5( 
2
MD4(UNICODE(Passwd)), UNICODE(ConcatenationOf( Uppercase(User), 
3
UserDom ) ) )
4
EndDefine

wäre in Perl (um mal eine ganz unbeteiligte, Windows-Ferne Sprache zu 
nehmen) wohl etwas wie:
1
use Digest::HMAC_MD5 qw(hmac_md5_hex);
2
use Digest::MD4 qw(md4_hex);
3
sub NTOWFv2 {
4
  my ($password, $user, $domain)=@_;
5
  return hmac_md5_hex(md4_hex($password), uc($ser).$domain));
6
}
(ohne Garantie, besonders bzgl. Parameter-Reihenfolge und "_hex" vs 
"_base64" etc...)

von Borislav B. (boris_b)


Lesenswert?

Nimm doch MD5, ist im .NET Framework integriert.

von Sebastian N. (sebastian_neusch)


Lesenswert?

es geht aber um den NTLM wegen windows 7.

ehh ich verstehe aber nicht wie ich das in c# übersetzen muss kannst du 
mir das erklären oder eine Quelle nennen?

mfg

von Sebastian N. (sebastian_neusch)


Lesenswert?

Ehrlich gesagt hab mir jetzt einfach die Funktion in C geschrieben.

von Borislav B. (boris_b)


Lesenswert?

Sebastian N. schrieb:
> Ehrlich gesagt hab mir jetzt einfach die Funktion in C geschrieben.

Aha. Und warum nicht in C#, wenn dein Projekt doch C# ist?

von Sebastian N. (sebastian_neusch)


Lesenswert?

ehrlich gesagt ich bekomms zwar in cauf die reihe aber nicht das ganze 
gerade in ne dll zu verpacken.

ich wollte dann die dll in c# einbinden.

naja und für c# find ich nichts gescheites. und wie man den code 
übersetzt, da bin ich zu schlecht in c.

also wenn jemand den passenden algo in .net da hat raus damit. :)

von Olli (Gast)


Lesenswert?

Zeig Doch mal dein C-Programm. Das kann man bestimmt sehr einfach in C# 
übersetzen.
Ich glaube WIn7 verwendet die v2-Version.
Und wenn ich das richtig verstehe, werden die MD5- und MD4-Algorithmen 
nacheinander angewendet. Den MD5-Algorithmus findest Du in der 
Framework-Klasse System.Security.Cryptography. Den MD4-Algo würde ich 
bei www.codeproject.com suchen.

VG Oliver

von Kopfschüttel (Gast)


Lesenswert?

Wieder ein "Copy & Paste" Programmierer
Kopfschüttel.

von Sebastian N. (sebastian_neusch)


Lesenswert?

Hier mal der code:
ist auch nur copy hab ich also nicht selber "geschireben".
hab eigentlich auch nicht viel mit c am hut.
Ich sag ja mein Problem ist dasss ich diesen Code nicht zu ner DLL bring 
hab da bei c zu wenig ahnung.
1
#include <string.h>
2
#include <stdio.h>
3
 
4
//Init values
5
#define INIT_A 0x67452301
6
#define INIT_B 0xefcdab89
7
#define INIT_C 0x98badcfe
8
#define INIT_D 0x10325476
9
 
10
#define SQRT_2 0x5a827999
11
#define SQRT_3 0x6ed9eba1
12
 
13
unsigned int nt_buffer[16];
14
unsigned int output[4];
15
char hex_format[33];
16
char itoa16[17] = "0123456789ABCDEF";
17
 
18
//This is the MD4 compress function
19
static void ntlm_crypt()
20
{
21
  unsigned int a = INIT_A;
22
  unsigned int b = INIT_B;
23
  unsigned int c = INIT_C;
24
  unsigned int d = INIT_D;
25
 
26
  /* Round 1 */
27
  a += (d ^ (b & (c ^ d)))  +  nt_buffer[0]  ;a = (a << 3 ) | (a >> 29);
28
  d += (c ^ (a & (b ^ c)))  +  nt_buffer[1]  ;d = (d << 7 ) | (d >> 25);
29
  c += (b ^ (d & (a ^ b)))  +  nt_buffer[2]  ;c = (c << 11) | (c >> 21);
30
  b += (a ^ (c & (d ^ a)))  +  nt_buffer[3]  ;b = (b << 19) | (b >> 13);
31
 
32
  a += (d ^ (b & (c ^ d)))  +  nt_buffer[4]  ;a = (a << 3 ) | (a >> 29);
33
  d += (c ^ (a & (b ^ c)))  +  nt_buffer[5]  ;d = (d << 7 ) | (d >> 25);
34
  c += (b ^ (d & (a ^ b)))  +  nt_buffer[6]  ;c = (c << 11) | (c >> 21);
35
  b += (a ^ (c & (d ^ a)))  +  nt_buffer[7]  ;b = (b << 19) | (b >> 13);
36
 
37
  a += (d ^ (b & (c ^ d)))  +  nt_buffer[8]  ;a = (a << 3 ) | (a >> 29);
38
  d += (c ^ (a & (b ^ c)))  +  nt_buffer[9]  ;d = (d << 7 ) | (d >> 25);
39
  c += (b ^ (d & (a ^ b)))  +  nt_buffer[10] ;c = (c << 11) | (c >> 21);
40
  b += (a ^ (c & (d ^ a)))  +  nt_buffer[11] ;b = (b << 19) | (b >> 13);
41
 
42
  a += (d ^ (b & (c ^ d)))  +  nt_buffer[12] ;a = (a << 3 ) | (a >> 29);
43
  d += (c ^ (a & (b ^ c)))  +  nt_buffer[13] ;d = (d << 7 ) | (d >> 25);
44
  c += (b ^ (d & (a ^ b)))  +  nt_buffer[14] ;c = (c << 11) | (c >> 21);
45
  b += (a ^ (c & (d ^ a)))  +  nt_buffer[15] ;b = (b << 19) | (b >> 13);
46
 
47
  /* Round 2 */
48
  a += ((b & (c | d)) | (c & d)) + nt_buffer[0] +SQRT_2; a = (a<<3 ) | (a>>29);
49
  d += ((a & (b | c)) | (b & c)) + nt_buffer[4] +SQRT_2; d = (d<<5 ) | (d>>27);
50
  c += ((d & (a | b)) | (a & b)) + nt_buffer[8] +SQRT_2; c = (c<<9 ) | (c>>23);
51
  b += ((c & (d | a)) | (d & a)) + nt_buffer[12]+SQRT_2; b = (b<<13) | (b>>19);
52
 
53
  a += ((b & (c | d)) | (c & d)) + nt_buffer[1] +SQRT_2; a = (a<<3 ) | (a>>29);
54
  d += ((a & (b | c)) | (b & c)) + nt_buffer[5] +SQRT_2; d = (d<<5 ) | (d>>27);
55
  c += ((d & (a | b)) | (a & b)) + nt_buffer[9] +SQRT_2; c = (c<<9 ) | (c>>23);
56
  b += ((c & (d | a)) | (d & a)) + nt_buffer[13]+SQRT_2; b = (b<<13) | (b>>19);
57
 
58
  a += ((b & (c | d)) | (c & d)) + nt_buffer[2] +SQRT_2; a = (a<<3 ) | (a>>29);
59
  d += ((a & (b | c)) | (b & c)) + nt_buffer[6] +SQRT_2; d = (d<<5 ) | (d>>27);
60
  c += ((d & (a | b)) | (a & b)) + nt_buffer[10]+SQRT_2; c = (c<<9 ) | (c>>23);
61
  b += ((c & (d | a)) | (d & a)) + nt_buffer[14]+SQRT_2; b = (b<<13) | (b>>19);
62
 
63
  a += ((b & (c | d)) | (c & d)) + nt_buffer[3] +SQRT_2; a = (a<<3 ) | (a>>29);
64
  d += ((a & (b | c)) | (b & c)) + nt_buffer[7] +SQRT_2; d = (d<<5 ) | (d>>27);
65
  c += ((d & (a | b)) | (a & b)) + nt_buffer[11]+SQRT_2; c = (c<<9 ) | (c>>23);
66
  b += ((c & (d | a)) | (d & a)) + nt_buffer[15]+SQRT_2; b = (b<<13) | (b>>19);
67
 
68
  /* Round 3 */
69
  a += (d ^ c ^ b) + nt_buffer[0]  +  SQRT_3; a = (a << 3 ) | (a >> 29);
70
  d += (c ^ b ^ a) + nt_buffer[8]  +  SQRT_3; d = (d << 9 ) | (d >> 23);
71
  c += (b ^ a ^ d) + nt_buffer[4]  +  SQRT_3; c = (c << 11) | (c >> 21);
72
  b += (a ^ d ^ c) + nt_buffer[12] +  SQRT_3; b = (b << 15) | (b >> 17);
73
 
74
  a += (d ^ c ^ b) + nt_buffer[2]  +  SQRT_3; a = (a << 3 ) | (a >> 29);
75
  d += (c ^ b ^ a) + nt_buffer[10] +  SQRT_3; d = (d << 9 ) | (d >> 23);
76
  c += (b ^ a ^ d) + nt_buffer[6]  +  SQRT_3; c = (c << 11) | (c >> 21);
77
  b += (a ^ d ^ c) + nt_buffer[14] +  SQRT_3; b = (b << 15) | (b >> 17);
78
 
79
  a += (d ^ c ^ b) + nt_buffer[1]  +  SQRT_3; a = (a << 3 ) | (a >> 29);
80
  d += (c ^ b ^ a) + nt_buffer[9]  +  SQRT_3; d = (d << 9 ) | (d >> 23);
81
  c += (b ^ a ^ d) + nt_buffer[5]  +  SQRT_3; c = (c << 11) | (c >> 21);
82
  b += (a ^ d ^ c) + nt_buffer[13] +  SQRT_3; b = (b << 15) | (b >> 17);
83
 
84
  a += (d ^ c ^ b) + nt_buffer[3]  +  SQRT_3; a = (a << 3 ) | (a >> 29);
85
  d += (c ^ b ^ a) + nt_buffer[11] +  SQRT_3; d = (d << 9 ) | (d >> 23);
86
  c += (b ^ a ^ d) + nt_buffer[7]  +  SQRT_3; c = (c << 11) | (c >> 21);
87
  b += (a ^ d ^ c) + nt_buffer[15] +  SQRT_3; b = (b << 15) | (b >> 17);
88
 
89
  output[0] = a + INIT_A;
90
  output[1] = b + INIT_B;
91
  output[2] = c + INIT_C;
92
  output[3] = d + INIT_D;
93
}  
94
 
95
//This include the Unicode conversion and the padding
96
static void prepare_key(char *key)
97
{
98
  int i=0;
99
  int length=strlen(key);
100
  memset(nt_buffer,0,16*4);
101
  //The length of key need to be <= 27
102
  for(;i<length/2;i++)  
103
    nt_buffer[i] = key[2*i] | (key[2*i+1]<<16);
104
 
105
  //padding
106
  if(length%2==1)
107
    nt_buffer[i] = key[length-1] | 0x800000;
108
  else
109
    nt_buffer[i]=0x80;
110
  //put the length
111
  nt_buffer[14] = length << 4;
112
}
113
 
114
//This convert the output to hexadecimal form
115
static void convert_hex()
116
{
117
  int i=0;
118
  //Iterate the integer
119
  for(;i<4;i++)
120
  {
121
    int j=0;
122
    unsigned int n=output[i];
123
    //iterate the bytes of the integer    
124
    for(;j<4;j++)
125
    {
126
      unsigned int convert=n%256;
127
      hex_format[i*8+j*2+1]=itoa16[convert%16];
128
      convert=convert/16;
129
      hex_format[i*8+j*2+0]=itoa16[convert%16];
130
      n=n/256;
131
    }  
132
  }
133
  //null terminate the string
134
  hex_format[33]=0;
135
}

von Borislav B. (boris_b)


Lesenswert?

Wie der Name schon suggeriert sind C# und C sich sehr ähnlich, was die 
Syntax angeht. Die Übersetzung des Code-Blocks ist daher recht einfach 
möglich.
Für alle Hilfsfunktion (strlen, itoa etc.) findest du im .Net-Framework 
auch leicht passende Entsprechungen.

Das schaffst du :-)

von Sebastian N. (sebastian_neusch)


Lesenswert?

Danke für den Zuspruch.

ich werde nun wohl oder übel C/C++ lernen aus Leisungsgründen,
da dieses Programm sehr schnell arbeiten Muss/soll.

Visual C++ 2010 Markt und Technik vor mir:)

von Arc N. (arc)


Lesenswert?

Sebastian N. schrieb:
> Danke für den Zuspruch.
>
> ich werde nun wohl oder übel C/C++ lernen aus Leisungsgründen,
> da dieses Programm sehr schnell arbeiten Muss/soll.
>
> Visual C++ 2010 Markt und Technik vor mir:)

Oder wenn eine passende GPU im Rechner steckt
https://openclnet.codeplex.com/
und z.B. MD4 auf der GPU rechnen lassen
http://www2.htw-dresden.de/~s64599/6.%20Semester/Informationssicherheit/Prakt/Prakt01/john-1.7.9-jumbo-7/src/opencl/md4_kernel.cl

von Εrnst B. (ernst)


Lesenswert?

Arc Net schrieb:
> Oder wenn eine passende GPU im Rechner steckt

Lohnt aber nur für die umgekehrte Richtung... Man kennt den NTLM-Hash 
und möchte das dazugehörige Passwort herausbekommen ("cracken/hacken").

von Arc N. (arc)


Lesenswert?

Εrnst B✶ schrieb:
> Lohnt aber nur für die umgekehrte Richtung... Man kennt den NTLM-Hash
> und möchte das dazugehörige Passwort herausbekommen ("cracken/hacken").

Keine Ahnung wie gut der oben verlinkte MD4 gegenüber einer reinen 
CPU-Implementierung abschneidet und vor allem was der TO eigentlich vor 
hat...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.