88542_1 

po polsku


Strona: [  >  ]  z  1     










Autor
Temat: Protokó³ GG - hash has³a











bisiek







Typ:
neutral

Postów: 487

Zarejestrowany: Jul 2003





Protokó³ GG - hash has³a


Witam

Oryginalna procedura to:

int gg_login_hash(char *password, int seed)
{
unsigned int x, y, z;

y = seed;

for (x = 0; *password; password++) {
  x = (x & 0xffffff00) | *password;
  y ^= x;
  y += x;
  x <<= 8;
  y ^= x;
  x <<= 8;
  y -= x;
  x <<= 8;
  y ^= x;

  z = y & 0x1f;
  y = (y << z) | (y >> (32 - z));
}

return y;
}

Po przetworzeniu na VB (tak znalaz³em na forum) wygl±da tak:

Function MKHash(ByVal password As String, ByVal seed As Long) As Long
Dim x As Long, y As Long, z As Long, i As Long

y = seed

For i = 1 To Len(password)
  x = (x And &HFFFFFF00) Or LenB(password)
  y = y Xor x
  y = y + x
  x = LShift(x, 8)
  y = y Xor x
  x = LShift(x, 8)
  y = y - x
  x = LShift(x, 8)
  y = y Xor x
 
  z = y And &H1F
 
  y = (LShift(y, z)) Or (RShift(y, (32 - z)))
Next

MKHash = y
End Function

I zastanawia mnie w tym, ¿e:
a) *password wystêpuje dwa razy i jest zmieniony na Len(password) i LenB(password). Dlaczego?
b) Funkcja jest podana dobrze, a hash has³a chyba zale¿y chyba nie tylko od jego d³ugo¶ci, ale tak¿e od jego tre¶ci. Tylko gdzie s± wprowadzane te znaki - bo znalaz³em tylko d³ugo¶æ?


[Post edytowany dnia 06-12-2004 18:43 przez bisiek]


_____________________________________________
www.mob.abc.pl - moja strona o VB






06-12-2004 18:37



 
        

3380672














anonim







Typ:
Nie zarejestrowany






seed - co to oznacza ten argument skad wziac jego wartosc?







06-12-2004 18:46


  














marcin_an

Forumowicz






Typ:
neutral

Postów: 1265

Zarejestrowany: Mar 2004







Ju¿ skrobiê wersjê w VB...



_____________________________________________
Popieram losmaca:
1) Ludzie, dbajcie o polszczyznê!!! 
2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie och³apy i trzeba siê domy¶laæ o co chodzi!!!
___
NOWE FORUM






07-12-2004 02:58



 
    














marcin_an

Forumowicz






Typ:
neutral

Postów: 1265

Zarejestrowany: Mar 2004







To powinno ju¿ dzia³aæ dobrze:
Function gg_login_hash(sPassword As String, nSeed As Long) As Long
    Dim x As Long, y As Long, z As Long
    Dim ptrCC As Long
   
    y = nSeed
   
    For ptrCC = 0 To Len(sPassword) - 1
        x = x And &HFFFFFF00
        x = x Or CLng(Asc(Mid$(sPassword, ptrCC + 1, 1)))
        y = y Xor x
        y = usum(y, x)
        x = lsh(x, 8)
        y = y Xor x
        x = lsh(x, 8)
        y = udif(y, x)
        x = lsh(x, 8)
        y = y Xor x
       
        z = y And &H1F&
        y = lsh(y, z) Or rsh(y, 32 - z)
    Next
    gg_login_hash = y
End Function

Trzeba tylko jeszcze dopisaæ 4 funkcje:
lsh, rsh (left-shift, right-shift)
usum, udif (sumowanie, odejmowanie)

To tak¿e postaram siê zrobiæ, ale mo¿e chwilkê potrwaæ (VB u¿ywa dope³nienia do 1, co trochê utrudnia dzia³ania na poziomie bitów).


[Post edytowany dnia 07-12-2004 03:59 przez marcin_an]


_____________________________________________
Popieram losmaca:
1) Ludzie, dbajcie o polszczyznê!!! 
2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie och³apy i trzeba siê domy¶laæ o co chodzi!!!
___
NOWE FORUM






07-12-2004 03:56



 
    














bisiek







Typ:
neutral

Postów: 487

Zarejestrowany: Jul 2003







Wg. mnie VB lepiej radzi sobie z dodawaniem i odejmowaniem ni¿ z oreracjami bitowymi. Dlatego przygotowa³em ju¿ funkcje and, or, xor

Public Function lXor(ByVal l1 As Variant, l2 As Variant) As Variant
    Dim a As Variant, b As Variant, c As Variant, d As Long
    Do
        DoEvents
        a = (l1 / 256 - Int(l1 / 256)) * 256
        b = (l2 / 256 - Int(l2 / 256)) * 256
        l1 = Int(l1 / 256)
        l2 = Int(l2 / 256)
       
        c = c + (a Xor b) * (256 ^ d)
        d = d + 1
        If l1 = 0 And l2 = 0 Then Exit Do
    Loop
    lXor = c
End Function

Public Function lAnd(ByVal l1 As Variant, l2 As Variant) As Variant
    Dim a As Variant, b As Variant, c As Variant, d As Long
    Do
        DoEvents
        a = (l1 / 256 - Int(l1 / 256)) * 256
        b = (l2 / 256 - Int(l2 / 256)) * 256
        l1 = Int(l1 / 256)
        l2 = Int(l2 / 256)
       
        c = c + (a And b) * (256 ^ d)
        d = d + 1
        If l1 = 0 And l2 = 0 Then Exit Do
    Loop
    lAnd = c
End Function

Public Function lOr(ByVal l1 As Variant, l2 As Variant) As Variant
    Dim a As Variant, b As Variant, c As Variant, d As Long
    Do
        DoEvents
        a = (l1 / 256 - Int(l1 / 256)) * 256
        b = (l2 / 256 - Int(l2 / 256)) * 256
        l1 = Int(l1 / 256)
        l2 = Int(l2 / 256)
       
        c = c + (a Or b) * (256 ^ d)
        d = d + 1
        If l1 = 0 And l2 = 0 Then Exit Do
    Loop
    lOr = c
End Function

Funkcje LShift i RShift mo¿na znale¶æ w VBFaq:

Public Function LShift(ByVal lThis As Variant, ByVal lBits As Variant) As Variant
    If (lBits <= 0) Then
      'b³êdny parametr ...
      LShift = lThis
    ElseIf (lBits > 31) Then
      'b³êdny parametr ...
      LShift = 0
    Else
      If (lAnd(lThis, (2 ^ (31 - lBits)))) = (2 ^ (31 - lBits)) Then
        LShift = (lAnd(lThis, (2 ^ (31 - lBits) - 1))) * lOr((2 ^ lBits), &H80000000)
      Else
        LShift = (lAnd(lThis, (2 ^ (31 - lBits) - 1))) * (2 ^ lBits)
      End If
    End If
  End Function

  Public Function RShift(ByVal lThis As Variant, ByVal lBits As Variant) As Variant
    If (lBits <= 0) Then
      'b³êdny parametr ...
      RShift = lThis
    ElseIf (lBits > 31) Then
      'b³êdny parametr ...
      RShift = 0
    Else
      If lAnd(lThis, &H80000000) = &H80000000 Then
        RShift = lAnd(lThis, &H7FFFFFFF)  lOr((2 ^ lBits), (2 ^ (31 - lBits)))
      Else
        RShift = lThis / (2 ^ lBits)
      End If
    End If
  End Function


Ju¿ je przerobi³em tak, zby u¿ywa³u funkcji bitowych dla d³ugich liczb, ale nie mam pewno¶ci ¿e gdzie¶ nie ma b³êdu.

Dziêki za poprawion± pêtlê.


[Post edytowany dnia 07-12-2004 10:12 przez bisiek]


_____________________________________________
www.mob.abc.pl - moja strona o VB






07-12-2004 10:03



 
        

3380672














marcin_an

Forumowicz






Typ:
neutral

Postów: 1265

Zarejestrowany: Mar 2004







W lXor np. dla 0xFFFF i 0xFFFF wystêpuje overflow.
Poza tym nie zauwa¿y³em by nie radzi³ sobie z operacjami bitowymi, natomiast nie ma wbudowanych funkcji do dodawania i odejmowania, dlatego w³a¶nie je wybra³em. Co prawda mo¿na zastosowaæ zmienne 64-bitowe, z którymi sobie proadzi, ale wtedy trzeba znowu pisaæ du¿o funkcji na wszystko inne, zamieniaæ na 32-bitowe, potem wracaæ do zapisu 64-bitowego itd...



_____________________________________________
Popieram losmaca:
1) Ludzie, dbajcie o polszczyznê!!! 
2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie och³apy i trzeba siê domy¶laæ o co chodzi!!!
___
NOWE FORUM






07-12-2004 16:23



 
    














bisiek







Typ:
neutral

Postów: 487

Zarejestrowany: Jul 2003







Hmm, sprawdzi³em - podaje 0 i nie wystêpuje overflow. Co do dodwania i odejmowania - typowych funkcji nie ma, ale dlaczego nie u¿yæ operatorów?



_____________________________________________
www.mob.abc.pl - moja strona o VB






07-12-2004 17:35



 
        

3380672














marcin_an

Forumowicz






Typ:
neutral

Postów: 1265

Zarejestrowany: Mar 2004







Ja sprawdzi³emi wysz³o mi overflow...
Dodawanie i odejmowanie - VB nie potrafi dodawaæ i odejmowaæ takich liczb, albo siê nie rozumiemy. Podaj przyk³ad .



_____________________________________________
Popieram losmaca:
1) Ludzie, dbajcie o polszczyznê!!! 
2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie och³apy i trzeba siê domy¶laæ o co chodzi!!!
___
NOWE FORUM






08-12-2004 04:18



 
    














bisiek







Typ:
neutral

Postów: 487

Zarejestrowany: Jul 2003







Maksymalny rozmiar liczb to 32 bity czyli powinien poradziæ sobie tak¿e z operacjami takimi jak:

MsgBox 4294967295# Xor 4294967296#
MsgBox 4294967296# - 4294967296#

Kiedy próbujê to wykonaæ, to jest b³±d przy xor, a przy odejmowaniu nie ma.



_____________________________________________
www.mob.abc.pl - moja strona o VB






08-12-2004 16:23



 
        

3380672














marcin_an

Forumowicz






Typ:
neutral

Postów: 1265

Zarejestrowany: Mar 2004







Problem w tym, ¿e w kodzie potrzebne s± 32-bitowe.. ale bez znaków. VB nie ma wbudowanych typów tego rodzaju i nie potrafi ich obs³ugoiwaæ. W³a¶nie z tym od samego pocz±tku by³ problem. Mo¿na albo zast±piæ je zmiennymi 64-bitowymi, które bêd± w stanie przechowaæ wynik i bêdzie mo¿na u¿ywaæ ich do dodawania i odejmowania, ale trzeba bêdzie dorobiæ funkcje odpowiedzialne za operacje binarne. Mo¿na te¿ pozostaæ przy 32-bitowych i dorobiæ tylko 2 funkcje - do sumowania i odejmowania. Poniewa¿ z tym drugim jest znacznie mniej roboty - wybra³em w³asnie takie rozwiazanie .



_____________________________________________
Popieram losmaca:
1) Ludzie, dbajcie o polszczyznê!!! 
2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie och³apy i trzeba siê domy¶laæ o co chodzi!!!
___
NOWE FORUM






08-12-2004 17:10



 
    














bisiek







Typ:
neutral

Postów: 487

Zarejestrowany: Jul 2003







Aha, bo np. long jest 32-bitowe i przy xor z dodatnich stan± siê ujemnymi. Ju¿ wszysko rozumiem.

Tylko, ¿e nied³ugo powinno wyj¶c GG 7.0 i prawdopodobnie zmieni siê sposób hashowania i stara wersja ju¿ nie bêdzie do niczego potrzebna.



_____________________________________________
www.mob.abc.pl - moja strona o VB






08-12-2004 18:38



 
        

3380672













Wszystkich odpowiedzi: 10 :: Maxymalnie na stronê: 20










Strona: [  >  ]  z  1     
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • pajaa1981.pev.pl