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 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
Vielen Dank, welche dieser Versionen wird bei Windows 7 verwendet. Mfg
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...)
Nimm doch MD5, ist im .NET Framework integriert.
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
Ehrlich gesagt hab mir jetzt einfach die Funktion in C geschrieben.
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?
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. :)
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
Wieder ein "Copy & Paste" Programmierer Kopfschüttel.
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 | }
|
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 :-)
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:)
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
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").
Ε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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.