Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6 ja RC4-kryptaus

Aku2 [27.09.2006 21:28:04]

#

Olisi pieni ongelma RC4 kryptauksessa.

Ongelma on se, että itse kryptaus toimii, mutta purku toimi vasta toisella purulla.
Eli purkamisen joutuu tekemään kahteen kertaan, jotta tiedoston saa selkokieliseksi.

Olisiko vinkkejä mikä tässä mättää.


Eli koodit menee seuraavasti:

Purku:

Private Sub Command2_Click()
    Dim inbyte As Byte
    Dim z As Long
    Dim IntCheckFile As Integer
    Dim Tarkiste As Byte

    i = 0: j = 0

     Tunnari = "TUNNUS"

     RC4ini (Tunnari)


    Open App.Path & "\Password1.dat" For Binary As 1
    Open App.Path & "\Password.dat" For Binary As 2

    For z = 1 To LOF(1)
        Get #1, , inbyte
        Put #2, , EnDeCryptSingle(inbyte)
    Next z


    Close 1
    Close 2

End Sub

Kryptaus:

Private Sub Command1_Click()
    Dim inbyte As Byte
    Dim z As Long
    Dim Tarkiste

    Tunnari = "TUNNUS"

    i = 0: j = 0

    RC4ini (Tunnari)

    Open App.Path & "\Password.dat" For Binary As 1
    Open App.Path & "\Password1.dat" For Binary As 2

    For z = 1 To LOF(1)
        Get #1, , inbyte
        Put #2, , EnDeCryptSingle(inbyte)
    Next

    Close 1
    Close 2

End Sub

Ja moduulin tiedot:

Option Explicit
Dim s(0 To 255) As Integer
Dim kep(0 To 255) As Integer
Dim i As Integer, j As Integer
Dim Tunnari As String

'Salasanan tallennus ja kryptaus
Public Sub RC4ini(Pwd As String)

    Dim temp As Integer, a As Integer, b As Integer
    b = 0
    'temp = 0 'testausta
    For a = 0 To 255
        b = b + 1
        If b > Len(Pwd) Then
            b = 1
        End If
        kep(a) = Asc(Mid$(Pwd, b, 1))
    Next a
    For a = 0 To 255
        s(a) = a
    Next a
    b = 0

    For a = 0 To 255
        b = (b + s(a) + kep(a)) Mod 256
        temp = s(a)
        s(a) = s(b)
        s(b) = temp
    Next a

End Sub


Public Function EnDeCryptSingle(plainbyte As Byte) As Byte
'RC4 kryptaus
    Dim temp As Integer, k As Integer
    Dim cipherby As Byte
    i = (i + 1) Mod 256
    j = (j + s(i)) Mod 256
    temp = s(i)
    s(i) = s(j)
    s(j) = temp
    k = s((s(i) + s(j)) Mod 256)
    cipherby = plainbyte Xor k
    EnDeCryptSingle = cipherby
End Function

Antti Laaksonen [27.09.2006 22:55:21]

#

Helppo ratkaisu on purkaa viesti aina kahdesti, jos kerran tämä toimii.

Jos haluat selvittää, miksi ohjelma käyttäytyy näin, tutki ohjelman toimintaa rivi riviltä ja vertaa sitä RC4:n määrittelyyn.

Aku2 [28.09.2006 08:20:40]

#

Olen tuota tutkinut varmaan miljoona kertaa eikä ole selvinnyt, miksi se niin tekee.
On käyty rivi riviltä ja käytetty vaikka mitä tapoja, mutta ei ole selvinnyt.

Kahteen kertaan "ohjelmallisesti" purkukaan ei oikein tulisi kyseeseen, vaan olisi kyllä tarkoitus saada se toimimaan ihan yhdelläkin kertaa.

Aku2 [30.09.2006 15:23:04]

#

Ongelma selvisi.
moduulin muuttujien määrityksissä oli hieman ongelmia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta