Seite 1 von 1

CODY - billiger Highscore-Crypter

Verfasst: 10.06.2006 12:07
von Kaeru Gaman
*** PB 3.94 ***
bedingt aufwärtskompatibel

Hi Leutz

in letzter zeit sind des öfteren fragen nach codierung/verschlüsselung von Game-Daten aufgetaucht.

heute morgen hatte ich dann ne witzige idee, wie man sowas wie ne highscore nett verschlüsseln könnte.

also hab ich mich hingesetzt, und ein paar (vier) procedures geposselt.

ergebnis:
aus einer highscore-tabelle:

Code: Alles auswählen

SUPERMEIER - 64829
DOSE - 48562
DERDOOWEKLAUS - 32791
HAMSTERBACKE - 23184
KLO - 12288
IDIOT - 8192
ANGEBER - 4096
SCHWACHMAT - 2048
PUSSI - 1024
BILLGATES - 512
wird so eine verschlüsselte text-datei:
(die zeilenumbrüche hab ich zum posten eingefügt, in der datei steht nur ein einziger string)

Code: Alles auswählen

QGMEGBQDYQUQDVKMSQUOVWGFITXJVKJN
ROPLNGTWXKWHHPXDETNLVKBEDIKCOGNU
NZFGREONPXRVKLNOMTPXGGQRUVKPQRRX
XVGMUPUAFWKCKDLETGOOBUSPSFWKBFBK
HQGKCMRGKMRWKDWKMOMQUVGGVAYYOWKS
TSUWRGKLSVVQKDOCXKZEAB
bei nem späteren durchlauf wird das draus:

Code: Alles auswählen

QGHZBWLYTLPLYVKGMKOIPWGJMXBNVKAE
IFGCNGZCDQCNNVDJKZTRVKWZYDFXOGNU
NZFGREONPXRVKRTUSZVXGCMNQVKPQRRX
XVGJRMRXCWKIQJRKTGKKXQOLOBWKBFBK
HQGYQAFUYAFKYRWKLNLPTVGZOTRRHWKL
MLNPRGQRYBBWQJUIXKWBXY
das teil ist nur ne kleine spielerei.
es erhebt keinen anspruch auf besondere qualität oder unknackbarkeit,
nur den anspruch, recht witzig zu sein... ;)

von der grundidee kann man bestimmt was lernen für eigene verschlüsselungen.
die methode, die da hintersteckt, ist eine der ältesten verschlüsselungsmethoden der welt.


*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*

wer jetzt gerne mal rätseln möchte, wie das teil funktioniert, soll hier aufhören das posting zu lesen :mrgreen:

*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*


zuerst ne kurze Doku:

HSCRY_Encrypt_Field ( Type.l, Dat$ )
verschlüsseln ein einzelnes datenfeld (max. länge 26 zeichen)
Type = 0 -> String, darf nur Großbuchstaben enthalten,
Type = 1 -> Zahl, darf nur Ziffern enthalten
andere zeichen werden nicht angemeckert, werden aber evtl. nicht korrekt verarbeitet und könnten auch errors produzieren.

HSCRY_Decrypt_Field ( Dat$ )
entschlüsselt das datenfeld wieder.
die information ob string oder zahl ist enthalten.

HSCRY_Write_Field ( File_Nr.l, Dat$ )
schreibt ein einzelnes datenfeld ins File. es werden keine stopzeichen gesendet. mehrere hintereinander geschriebene felder erscheinen als ein einziger string.

HSCRY_Read_Field ( File_Nr.l )
liest das nächste datenfeld aus dem File. die länge des feldes ist eincodiert.

das argument File_Nr.l der beiden letzten procs wird nicht benötigt, ist beigefügt um die erweiterung auf PB4.0 zu erleichtern.

und hier ist der Code:

Code: Alles auswählen

; ***   CODY 0.1
; ***   by Kaeru Gaman
; ***   2006-06-10
; ***   PB 3.94
; *********************************************************

Procedure.s HSCRY_Encrypt_Field ( Type.l, Dat$ )

; Type = 0 crypts a string, Type = 1 a number

Leng.l  =  0    ; Length of Field
Len$    = ""    ; Crypted Length
Typ$    = ""    ; Crypted for Type
Base.l  =  0    ; Field individual Crypt-Key
Bas$    = ""    ; Crypt-Key Writechar
Proc$   = ""    ; Proceeding String
Crypt$  = ""    ; Encrypted Field
Char.l  =  0    ; single Char of string

Out$    = ""    ; Return String

n.l     =  0    ; Loopcounter


    Leng = Len( Dat$ )
        If Leng < 1 Or Leng > 26
            ProcedureReturn ""
        EndIf
    Len$ = Chr( 91 - Leng )

    Type & 1    ; Only Bit 1
    Typ$ = Chr( 71 + 4 * Type )

    Base = Random( 25 )
    Bas$ = Chr( Base + 65 )

    For n=1 To Leng
        Proc$ + Chr( Asc( Mid( Dat$, n, 1) ) + ( 17 * Type ) )
    Next

    For n=1 To Leng
        Char = Asc( Mid( Proc$, n, 1) ) + Base
        If Char > 90
            Char - 26
        EndIf
        Crypt$ + Chr( Char )
    Next

    Out$ = Len$ + Typ$ + Bas$ + Crypt$

    ProcedureReturn Out$

EndProcedure

; *********************************************************

Procedure.s HSCRY_Decrypt_Field ( Dat$ )

Leng.l  =  0    ; Length of Field
Len$    = ""    ; Crypted Length
Typ$    = ""    ; Crypted for Type
Type.l  =  0    ; Type-Flag
Base.l  =  0    ; Field individual Crypt-Key
Bas$    = ""    ; Crypt-Key Writechar
Proc$   = ""    ; Proceeding String
Crypt$  = ""    ; Encrypted Field
Char.l  =  0    ; single Char of string

Out$    = ""    ; Return String

n.l     =  0    ; Loopcounter

    Len$   = Mid( Dat$, 1, 1)
    Leng   = 91 - Asc( Len$ )
    Typ$   = Mid( Dat$, 2, 1)
    Type   = ( Asc( Typ$ ) - 71 ) / 4
    Bas$   = Mid( Dat$, 3, 1)
    Base   = Asc( Bas$ ) - 65
    Crypt$ = Mid( Dat$, 4, Leng)
    
    For n=1 To Leng
        Char = Asc( Mid( Crypt$, n, 1 ) ) - Base
        If Char < 65
            Char + 26
        EndIf
        Proc$ + Chr( Char )
    Next

    For n=1 To Leng
        Out$ + Chr( Asc( Mid( Proc$, n, 1) ) - ( 17 * Type ) )
    Next

    ProcedureReturn Out$

EndProcedure

; *********************************************************

Procedure   HSCRY_Write_Field ( File_Nr.l, Dat$ )

Leng.l  =  0    ; Length of Field
n.l     =  0    ; Loopcounter

    Leng = Len( Dat$)

    For n=1 To Leng
        WriteByte( Asc( Mid( Dat$, n, 1 ) ) )
    Next    
    
EndProcedure

Procedure.s HSCRY_Read_Field ( File_Nr.l )

Leng.l  =  0    ; Length of Field
Len$    = ""    ; Crypted Length
Typ$    = ""    ; Crypted for Type
Bas$    = ""    ; Crypt-Key Writechar
Crypt$  = ""    ; Encrypted Field

Out$    = ""    ; Return String

n.l     =  0    ; Loopcounter

    Len$ = Chr( ReadByte() )
    Leng = 91 - Asc( Len$ )

    Typ$ = Chr( ReadByte() )
    Bas$ = Chr( ReadByte() )
    
    For n=1 To Leng
        Crypt$ + Chr( ReadByte() )
    Next

    Out$ = Len$ + Typ$ + Bas$ + Crypt$

    ProcedureReturn Out$

EndProcedure

; *********************************************************

Structure HS
    Name.s
    Scor.l
EndStructure

Dim HSTab.HS (9)

o$        = ""      ; String For Output
i$        = ""      ; String for Input
FileNum.l =  0      ; FileNumber

n.l       =  0      ; Loopcounter

; ***
; ***   Create HighscoreTable from Data
; ***

For n=0 To 9
    Read Nam$
    Read Sco
    HSTab(n)\Name = Nam$
    HSTab(n)\Scor = Sco
Next

; ***
; ***   Debug original HighscoreTable
; ***

For n=0 To 9
    o$ = HSTab(n)\Name + " - " + Str(HSTab(n)\Scor)
    Debug o$
Next

FileNum = 0

; ***
; ***   Encrypt HighscoreTable and write to File
; ***

CreateFile(FileNum, "Highscore.txt")
    For n=0 To 9
        o$ = HSCRY_Encrypt_Field( 0, HSTab(n)\Name )
        HSCRY_Write_Field( FileNum, o$ )
        o$ = HSCRY_Encrypt_Field( 1, Str( HSTab(n)\Scor ) )
        HSCRY_Write_Field( FileNum, o$ )
    Next
CloseFile(FileNum)

Debug "-----------------------"

; ***
; ***   Debug Encrypted File
; ***

ReadFile(FileNum, "Highscore.txt")
    i$ = ReadString()
CloseFile(FileNum)
Debug i$

Debug "-----------------------"

; ***
; ***   Read and Decrypt HighscoreTable from File
; ***

ReadFile(FileNum, "Highscore.txt")
    For n=0 To 9
        i$ = HSCRY_Read_Field( FileNum )
        HSTab(n)\Name = HSCRY_Decrypt_Field( i$ )
        i$ = HSCRY_Read_Field( FileNum )
        HSTab(n)\Scor = Val( HSCRY_Decrypt_Field( i$ ) )
    Next
CloseFile(FileNum)

; ***
; ***   Debug Re-Read HighscoreTable
; ***

For n=0 To 9
    o$ = HSTab(n)\Name + " - " + Str(HSTab(n)\Scor)
    Debug o$
Next

End

; ***
; ***   HighscoreTable as DATA
; ***

DataSection
Data.s "SUPERMEIER"
Data.l 64829
Data.s "DOSE"
Data.l 48562
Data.s "DERDOOWEKLAUS"
Data.l 32791
Data.s "HAMSTERBACKE"
Data.l 23184
Data.s "KLO"
Data.l 12288
Data.s "IDIOT"
Data.l 8192
Data.s "ANGEBER"
Data.l 4096
Data.s "SCHWACHMAT"
Data.l 2048
Data.s "PUSSI"
Data.l 1024
Data.s "BILLGATES"
Data.l 512
EndDataSection
die genaue vorgehensweise erläutere ich gerne in späteren postings...