[VB6 naar PHP] Omzetten Encrypt/Decrypt Script *

Pagina: 1
Acties:
  • 165 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met het volgende probleem. Bij een bedrijf draait een VB applicatie waatbij de username en wachtwoorden geencrypt in de MySQL database worden opgeslagen. Nu moet voor de website gebruik gemaakt worden van dezelfde database en dus ook van hetzelfde Encrypt/Decrypt Algoritme. Nu ben ik al een tijd bezig om het script om te zetten maar ik krijg het niet voor elkaar om php functies te maken die hetzelfde doen als de VB functies (heb helaas ook niet echt veel kennis van VB). De code van de VB functies staat hieronder:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Public Function Encrypt(SourceData As String, Password As String, Optional ExpandedOutput As Boolean = False) As String

' Decrypt an Encrypted string using the Encrypt
' returns a string that can be saved into a database
' MyString = GF.Decrypt(GF.Encrypt("This is my string", "My Password"), "My Password")

' optionally ExpandedOutput will return a string with no binary data for saving in a database
' or emailing.

Dim s$
Dim PC As Long
Dim lc As Long
Dim lOutCount As Long
Dim lChar As Long

lc = 1
If ExpandedOutput Then
    lc = 2
End If
s$ = Space$(Len(SourceData) * lc)
If Len(s$) = 0 Then Exit Function

lOutCount = 1

For lc = 1 To Len(SourceData)
    PC = PC + 1
    If PC > Len(Password) Then
        PC = 1
    End If
   
    lChar = Asc(Mid(SourceData, lc, 1)) Xor Asc(Mid$(Password, PC, 1))
    If ExpandedOutput Then
        ' Turn lchar into hex
        Mid$(s$, lOutCount, 1) = Chr(65 + (lChar And &HF0) / &H10)
        Mid$(s$, lOutCount + 1, 1) = Chr(65 + (lChar And &HF))
        lOutCount = lOutCount + 2
    Else
        Mid$(s$, lOutCount, 1) = Chr(lChar)
        lOutCount = lOutCount + 1
    End If
Next

Encrypt = s$

End Function


Public Function Decrypt(EncryptedData As String, Password As String, Optional ExpandedInput As Boolean = False) As String

' Decrypt an Encrypted string using the Encrypt
' returns a string that can be saved into a database
' MyString = GF.Decrypt(GF.Encrypt("This is my string", "My Password"), "My Password")

Dim s$
Dim lc As Long
Dim PC As Long
Dim lB1 As Long
Dim lB2 As Long
Dim lOutCount As Long
Dim lChar As Long

If Len(EncryptedData) = 0 Then Exit Function

If Not ExpandedInput Then
    Decrypt = Encrypt(EncryptedData, Password)
    Exit Function
End If

s$ = Space(Len(EncryptedData) * 0.5)

lc = 1
lOutCount = 1

' convert aphap data to binary data
Do While lc < Len(EncryptedData)
    lB1 = Asc(Mid(EncryptedData, lc, 1)) - 65
    lB2 = Asc(Mid(EncryptedData, lc + 1, 1)) - 65
    lc = lc + 2
    Mid$(s$, lOutCount, 1) = Chr((lB1 * 16) + lB2)
    
    lOutCount = lOutCount + 1
        
Loop

Decrypt = Encrypt(s$, Password)

End Function


Zou iemand mij op weg kunnen helpen met het omzetten van deze functies?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Kom op, probeer zelf eerst eens wat en geef dan aan wat neiet lukt. Het lijkt me niet echt de bedoeling dat we hier voor je gaan zitten coden.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op maandag 21 maart 2005 @ 14:26:
Kom op, probeer zelf eerst eens wat en geef dan aan wat neiet lukt. Het lijkt me niet echt de bedoeling dat we hier voor je gaan zitten coden.
Dit is de code doe ik tot nu toe heb.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function Encrypt($string){
$lengtestring = strlen($string);
$lengtestring = $lengtestring * 2;
$stringout="";
for($i=0;$i<$lengtestring;$i++){
$letter = ord(substr($string,$i,1));
$letter = $letter + 65;
$letter = bin2hex($letter);
$stringout .= chr($letter);
}
return $stringout;
}

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

En wat lukt er niet? ?Welke foutmeldingen krijg je? Heb je al lopen debuggen tot waar je welke waarden gelijk hebt?

Zie ook P&W FAQ - De "quickstart" :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Vooral dit stukje code geeft problemen:

Visual Basic:
1
2
3
4
5
6
    lChar = Asc(Mid(SourceData, lc, 1)) Xor Asc(Mid$(Password, PC, 1)) 
    If ExpandedOutput Then 
        ' Turn lchar into hex 
        Mid$(s$, lOutCount, 1) = Chr(65 + (lChar And &HF0) / &H10) 
        Mid$(s$, lOutCount + 1, 1) = Chr(65 + (lChar And &HF)) 
        lOutCount = lOutCount + 2 


Heb eigenlijk geen idee wat hier gebeurt ? En dus ook geen idee welke php functies ik kan gebruiken om het zelfde resultaat te behalen.

Acties:
  • 0 Henk 'm!

  • Mysteryman
  • Registratie: Februari 2001
  • Laatst online: 11:44

Mysteryman

kan jij wat ik kan...

misschien is het een idee om de gebruikersnamen en wachtwoorden gewoon te MD5'en... op die manier zitten ze ook gecrypt in de database en weet je alsnog niet wie het is ...

edit: oeps lees net pas dat je ook wil decrypten 8)7

[ Voor 14% gewijzigd door Mysteryman op 22-03-2005 07:57 ]

Everybody happy??? I soon change that here we go...


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Het lijkt me dat je hiermee zit:
code:
1
2
Mid$(s$, lOutCount, 1) = Chr(65 + (lChar And &HF0) / &H10) 
Mid$(s$, lOutCount + 1, 1) = Chr(65 + (lChar And &HF))


"Mid$(String, Integer, 1) = Char" in VBScript doet hetzelfde wat "$string[Integer - 1] = char" in PHP doet, Chr bestaat in PHP ook en het equivalent van And is & (niet &&, zie Bitwise Operators in de PHP manual).

[ Voor 36% gewijzigd door Gerco op 22-03-2005 08:22 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:10
Wat is uberhaupt de reden om nog te gaan decrypten afgezien van het opsturen van een missend wachtwoord? Sterker is om een one-way hash zoals MD5 te gebruiken en het wachtwoord bij de login alleen te vergelijken. Bij een missend wachtwoord kan je dan eenvoudig een nieuwe genereren, kan je ook nog sterkere wachtwoorden afdwingen dan de gemiddelde n00b kiest.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De reden om te gaan decrypten is dat ik werk met data opgeslagen in een Database van een applicatie die door een derde partij is ontwikkeld. Als ik zelf de keuze had gehad had ik ook gewoon voor md5 of iets degelijks gekozen. Helaas ben ik in dit project afhankelijk van de derde partij en deze houdt vast aan dit encrypt/decrypt algoritme.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Verwijderd schreef op dinsdag 22 maart 2005 @ 07:49:
Vooral dit stukje code geeft problemen:

Visual Basic:
1
2
3
4
5
6
    lChar = Asc(Mid(SourceData, lc, 1)) Xor Asc(Mid$(Password, PC, 1)) 
    If ExpandedOutput Then 
        ' Turn lchar into hex 
        Mid$(s$, lOutCount, 1) = Chr(65 + (lChar And &HF0) / &H10) 
        Mid$(s$, lOutCount + 1, 1) = Chr(65 + (lChar And &HF)) 
        lOutCount = lOutCount + 2 


Heb eigenlijk geen idee wat hier gebeurt ? En dus ook geen idee welke php functies ik kan gebruiken om het zelfde resultaat te behalen.
Visual Basic:
1
2
   
lChar = Asc(Mid(SourceData, lc, 1)) Xor Asc(Mid$(Password, PC, 1)) 

Het coderen en decoderen gaat met de Xor. Hier pakt hij 1 byte.
voorbeeld in bitjes:
bericht = 11001001
sleutel = 01
gecodeerd =
11001001 xor
01010101 =
10011100

gedecodeerd =
10011100 xor
01010101 =
11001001 = oorspronkelijk bericht

Coderen met de Xor schijnt niet zo goed zijn. Er zijn meerdere algoritmen.


Visual Basic:
1
2
3
 
' optionally ExpandedOutput will return a string with no binary data for saving in a database
' or emailing. 

Visual Basic:
1
2
3
4
5
    If ExpandedOutput Then 
        ' Turn lchar into hex 
        Mid$(s$, lOutCount, 1) = Chr(65 + (lChar And &HF0) / &H10) 
        Mid$(s$, lOutCount + 1, 1) = Chr(65 + (lChar And &HF)) 
        lOutCount = lOutCount + 2 

In hexadecimaal getal passen 4 bits.
(lChar And &HF0) / &H10 pakt hoge vier (meest significante)
lChar And &HF pakt lage vier (minst significante)
65 + ... berekent ascii code. 65 is A.
Chr(...) maakt er een character van
Mid$(s$, lOutCount, 1) propt het op de juiste plek in s$

Het hexadecimale getal wordt gecodeerd als ABCDEFGHIJKLMNOP in plaats van de gebruikelijke 0123456789ABCDEF


Normaal gebruik je een oneway-hash zoals MD5 voor het versturen van wachtwoorden over het internet. De server heeft de MD5 hash van het wachtwoord en bedenkt een nieuwe voor de sessie (bv hash van tijd). Samen wordt het gehashed tot een hash.
De client krijgt de sessiehash van de server. De hash van het wachtwoord en de combinatiehash worden op clientsite berekend. De combinatiehash wordt verstuurd naar server en server vergelijkt met wat hij berekend heeft.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met alle hulp ben ik inmiddels al een eind verder gekomen. De eerste 2 karakters kloppen. Dus heb ik een vermoeden dat er iets misgaat met mijn counters. De volgende code heb ik tot nu toe:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function Encrypt($string,$password){
    $lengtestringa = strlen($string);
    $lengtestring = $lengtestringa * 2;
    $lOutCount = 0;
    $PC=0;
        
    for($lc=0;$lc<$lengtestringa;$lc++){
        
        if($PC>strlen($password)){
            $PC=1;
        }

        $lChar  = (ord(substr($string,$lc,1)) ^ ord(substr($password,$PC,1)));
        $string[$lOutCount] = chr(65 + (($lChar & 240) / 16))  ;
        $string[$lOutCount+1] = chr(65 + ($lChar & 15)) ;
    
        $lOutCount = $lOutCount + 2;
        $PC = $PC + 1;
    }
    return $string;
}

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je zit in dezelfde string te lezen en te schrijven. In stap 1 schrijf je naar $string[1] en in stap 2 lees je eruit.

Stap 1:
$lOutCount = 0
$string[0] = chr(65 + (($lChar & 240) / 16)) ;
$string[1] = chr(65 + ($lChar & 15)) ;

Stap 2:
$lc =1
$lChar = (ord(substr($string,1,1)) ^ ord(substr($password,$PC,1)));


Dit is twouwens ook niet goed:
PHP:
1
2
3
if($PC>strlen($password)){
  $PC=1;
}


Zoals eerder al aangegeven telt php de characters van 0 tot strlen - 1. Als $PC hier buiten valt (dus groter of gelijk is aan strlen), dan begin je weer bij het begin (0) met tellen.
Pagina: 1