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
(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
Code: Alles auswählen
QGHZBWLYTLPLYVKGMKOIPWGJMXBNVKAE
IFGCNGZCDQCNNVDJKZTRVKWZYDFXOGNU
NZFGREONPXRVKRTUSZVXGCMNQVKPQRRX
XVGJRMRXCWKIQJRKTGKKXQOLOBWKBFBK
HQGYQAFUYAFKYRWKLNLPTVGZOTRRHWKL
MLNPRGQRYBBWQJUIXKWBXY
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

*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*
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