Strona: [  << <   1   > >>  ]  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
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       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...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-12-2004 02:58
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-12-2004 03:56
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       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...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-12-2004 16:23
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       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 .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

08-12-2004 04:18
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       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 .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

08-12-2004 17:10
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
Wszystkich odpowiedzi: 10 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1