Wo gibt es eine gute Hashfunktion für NTLM (C#)

#3392119
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
#3393625
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...)
Gast #3394072
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. :)
Gast #3394160
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
Gast #3394230
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
}
#3394987
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren