SU_EncodeLib Code & Download

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Suco-X

Betreff: SU_EncodeLib Code & Download

BeitragDo, Sep 02, 2004 5:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Blitzer.
Vor etwas längerer Zeit schrieb ich ein kleines Tutorial zum Thema "Verschlüsseln von Dateien". Da ich auf kleinere Bugs hingewiesen wurde habe ich mir gedacht das ganze nochmal zu überholen. Rausgekommen ist eine praktische Lib mit Funktionen die euch das schützen eurer Spieldaten erleichtern sollen. Mit dem Kommentieren habe ich vielleicht etwas übertrieben aber naja. Rolling Eyes
Der ein oder andere kann es vllt gebrauchen oder draus lernen.
Für Leute die sich nicht so gut mit der Anwendung von fremdem Code auskennen habe ich einen Download mit einem einfachen Beispiel vorbereitet.

Hier der Download http://www.sucox.art-fx.org/suencodelib.zip


Hier der Lib Code :

BlitzBasic: [AUSKLAPPEN]

;SU_EncodeLib© by Suco-X 2004

;******************************************************
; Alle Inhalte dieses Dokuments dürfen frei verwendet werden und können ohne weitere
; Verpflichtungen(Creadit Eintrag oder sonstiges) verwendet werden.
; Credit Eintrag wäre natürlich trotzdem ein freundlicher Zug.
;******************************************************


;******************************************************
; Die SU_EncodeLib dient dazu Dateien zu verschlüsseln und entschlüsseln um Spielinhalte wie Grafik oder Sounds
; vor fremden Missbrauch zu schützen.
; Es gibt keine Beschränkung in der Dateiart, es kann jede Datei ver/entschlüsselt werden.
; Sollte es Probleme mit dem Code geben oder Bugs auffallen so bin ich in in der Blitzbasic Community(www.blitzforum.de)
; oder meiner kleinen Homepage(www.blitz-pasting.de.vu) anzutreffen.
; Viel Spaß!
;******************************************************


;***********************************************************************************
; Die Funktionen
;
; SU_EncodeFile(fp_filename$,fp_key=SU_FILEKEY)
; Diese Funktion verschlüsselt eine Datei. fp_filename für den Dateinamen,fp_key für den verschlüssellungs Key.
; Siehe dazu die unten stehende SU_FILEKEY Konstante die default festgelegt ist.
;
; SU_DecodeFile$(fp_filename$,fp_key=SU_FILEKEY)
; Die Funktion entschlüssel eine Datei. Gleiche Parameter/bedeutung wie die verschlüssellungs Funktion.
;
; SU_EncodeDir(fp_dirname$,fp_key=SU_FILEKEY)
; Verschlüsselt alle Dateien von einem Verzeichniss. fp_dirname für den Pfad zu dem Verzeichniss, fp_key für den verschlüssellungskey
;
; SU_DecodeDir(fp_dirname$,fp_key=SU_FILEKEY)
; Entschlüsselt alle Dateien von einem Verzeichniss. Gleiche Parameter/bedeutung wie SU_EncodeDir.
;
; SU_ClearDecodedDir(fp_dirname$)
; Bereinigt ein Verzeichniss. Wurde SU_DecodeDir aufgerufen und die Dateien Entpackt für das Spiel, so können die Unverschlüsselten Dateien hiermit wieder
; entfernt werden
;
; SU_GetFilename$(fp_filename$)
; Spielt keine große Rolle. Gibt den Dateinamen von einem Pfad String aus.
;
;***********************************************************************************



;***********************************************************************************
; Wichtige Konstanten

; Jede verschlüsselte Datei bekommt einen 8 byte großen Header mit diesen zwei werten
; um Verwechselungen auszuschließen
Const SU_FILETYPE = 778822
Const SU_FILETYPE2 = 992200

; Der Key mit dem die Dateien ver/entschlüsselt werden
; In jeder Funktion ist dieser Wert standard angegeben
; Natürlich auch änderbar
Const SU_FILEKEY = 345678


; Sicherheitsbytes für die Bankerstellung
; Hin und wieder kann eine zu knappe Speicherkalkulation zu fehlern führen die plötzlich auftretten
; 10 bytes sind ausreichend und können nicht schaden. Sicher ist sicher.
; Wird zusätzlich an jede in dieser Lib benutzen Bankgröße angehängt
Const SU_SECBYTES = 10


; SU_ENCODEEXTENSION ist der Anhang der bei einer Verschlüsselten Datei vorne rankommt
; Hat den Zweck das die Original Dateien nicht gelöscht werden.
; Die verschlüsselten Dateien haben also den Dateinamen "SU_ENCODEEXTENSION+OriginalFilename"
Const SU_ENCODEEXTENSION$ = "suencoded_"


; Dem Dateinamen einer Datei die wieder Entschlüsselt wird, wird SU_ENCODEEXTENSION
; weggeschnitten und durch SU_DECODEEXTENSION ersetzt.
Const SU_DECODEEXTENSION$ = "tmp_"
;***********************************************************************************



;***********************************************************************************
; Funktion zum verschlüsseln einer Datei jeglicher Art.
Function SU_EncodeFile(fp_filename$,fp_key=SU_FILEKEY)

; Einige Lokale Variablen die in dieser Funktion gebraucht werden

Local if_databank = 0
Local if_filesize = 0
Local if_filestream = 0
Local if_tempbytes = 0
Local if_filedir$ = ""
Local if_finalfilename$ = ""


; Wen kein Dateiname angegeben ist oder die Datei nicht exestiert wird die Funktion verlassen

If fp_filename="" Or FileType(fp_filename)=0
Return False
EndIf


; Sollte sich die Datei in einem anderen Verzeichniss befinden so muss natürlich auch wieder
; dort die verschlüsselte datei angelegt werden.
; Der dateiname wird rausgefiltert und den verzeichniss namen erhält man durch
; das entfernen des dateinamens.

if_finalfilename = SU_GetFilename(fp_filename)
if_filedir = Replace(fp_filename,if_finalfilename,"")


; Dateigröße ermitteln und die Bank für die Datei Daten erstellen.

if_filesize=FileSize(fp_filename)
if_databank = CreateBank(if_filesize+SU_SECBYTES)

; Die zu verschlüsselnde Datei wird geöffnet

if_filestream=ReadFile(fp_filename)

; Wen die Datei schon verschlüsselt ist, wird die Funktion verlassen
If ReadInt(if_filestream)=SU_FILETYPE And ReadInt(if_filestream)=SU_FILETYPE2
CloseFile(if_filestream)
Return False
EndIf

; Wieder auf Position 0 in der Datei zurück springen
SeekFile if_filestream,0

; Daten in die Bank einlesen
ReadBytes(if_databank,if_filestream,0,if_filesize)
CloseFile(if_filestream)

; Kleine Verschlüsselung. Es werden immer 4 Bytes(Integer) aus der Bank genommen und verändert.
; Der Key spielt hierbei natürlich auch eine Rolle. Den Key muss der Eigentümer kennen, sonst kann die Datei nicht wieder entschlüsselt werden.
; Den Key mit in die Datei zu Speichern käme mir ein wenig schwachsinnig vor. Also immer schön merken die Keys.

For i = 0 To if_filesize Step 4
if_tempbytes = PeekInt(if_databank,i)
if_tempbytes = if_tempbytes+(fp_key+i)+65000
PokeInt(if_databank,i,if_tempbytes)
Next

; Vor dem eigentlichen dateinamen wird noch die SU_ENCODEEXTENSION angehangen.

if_finalfilename = SU_ENCODEEXTENSION+if_finalfilename

; Die neue Datei wird göffnet und mit den verschlüsselten Daten aus der Bank beschrieben

if_filestream = WriteFile(if_filedir+if_finalfilename)
WriteInt(if_filestream,SU_FILETYPE)
WriteInt(if_filestream,SU_FILETYPE2)
WriteBytes(if_databank,if_filestream,0,if_filesize)
CloseFile(if_filestream)

; Die Bank wird nicht mehr benötigt und daher wieder freigegeben.

FreeBank if_databank

Return True
End Function
;***********************************************************************************




;***********************************************************************************
; Funktion zum entschlüsseln einer Datei jeglicher Art.
Function SU_DecodeFile$(fp_filename$,fp_key=SU_FILEKEY)

; Einige Lokale Variablen die in dieser Funktion gebraucht werden
Local if_databank = 0
Local if_filesize = 0
Local if_filestream = 0
Local if_tempbytes = 0
Local if_filedir$ = ""
Local if_finalfilename$ = ""

; Wen kein Dateiname angegeben ist oder die Datei nicht exestiert, wird die Funktion verlassen
If fp_filename="" Or FileType(fp_filename)=0
Return False
EndIf


; Sollte sich die Datei in einem anderen Verzeichniss befinden so muss natürlich auch wieder
; dort die verschlüsselte Datei angelegt werden.
; Der dateiname wird rausgefiltert und den verzeichniss namen erhält man durch
; das entfernen des dateinamens.

if_finalfilename = SU_GetFilename(fp_filename)
if_filedir = Replace(fp_filename,if_finalfilename,"")


; Dateigröße ermitteln und die Bank für die Datei Daten erstellen.
; Da in einer Kodierten Datei noch 8 bytes für die Kennung enthalten sind werden diese
; direkt mal an dieser Stelle abgezogen

if_filesize=FileSize(fp_filename)-8
if_databank = CreateBank(if_filesize+SU_SECBYTES)


; Die zu entschlüsselnde Datei wird geöffnet
if_filestream=ReadFile(fp_filename)

; Wen die ersten 8 bytes nicht den wert von SU_FILETYPE und SU_FILETYPE2 enthalten, wird die Funktion verlassen
; Der Wert dient zur Sicherheitsabfrage ob eine Datei auch wirklich verschlüsselt ist.
If ReadInt(if_filestream)<>SU_FILETYPE And ReadInt(if_filestream)<>SU_FILETYPE2
CloseFile(if_filestream)
Return False
EndIf

; Datei Daten in die Bank einlesen

ReadBytes(if_databank,if_filestream,0,if_filesize)
CloseFile(if_filestream)

; Die Daten werden nach dem gleichen Prinzip(wie auch sonst) wie bei der Verschlüsselung wieder entschlüsselt.
; Nur umgekehrt.

For i = 0 To if_filesize Step 4
if_tempbytes = PeekInt(if_databank,i)
if_tempbytes = if_tempbytes-(fp_key+i)-65000
PokeInt(if_databank,i,if_tempbytes)
Next

; Die zu verschlüsselnde Datei sollte vor dem eigentlichen namen noch die SU_ENCODEExtension Kennung haben.
; Diese wird entfernt und die DECODE Extension wird hinzugefügt. In dem Fall tmp.
; Um das ganze zu ändern siehe die Konstanten oben im Code

if_finalfilename = Replace(if_finalfilename,SU_ENCODEEXTENSION$,"")
if_finalfilename = SU_DECODEEXTENSION+if_finalfilename


; Die neue Datei wird Göffnet und mit den entschlüsselten Daten aus der Bank beschrieben
if_filestream = WriteFile(if_filedir+if_finalfilename)
WriteBytes(if_databank,if_filestream,0,if_filesize)
CloseFile(if_filestream)

; Die Bank wird nicht mehr benötigt und daher wieder freigegeben.
FreeBank if_databank

; Der Dateiname der wieder hergestellten Original Datei wird zurückgegeben.
Return if_filedir+if_finalfilename
End Function
;***********************************************************************************




;***********************************************************************************
; Erweiterrung der Lib. Diese Funktion Verschlüsselt jede Datei eines verzeichnisses
Function SU_EncodeDir(fp_dirname$,fp_key=SU_FILEKEY)
Local if_verz = 0
Local if_filename$ = ""

If fp_dirname="" Or FileType(fp_dirname)<>2
Return False
EndIf

if_verz = ReadDir(fp_dirname)

Repeat

if_filename = NextFile(if_verz)

If FileType(fp_dirname+if_filename)=1
SU_EncodeFile(fp_dirname+if_filename,fp_key)
EndIf

Until if_filename=""

CloseDir(if_verz)

Return True
End Function
;***********************************************************************************



;***********************************************************************************
; Entschlüsselt jede Datei eines verzeichnisses
Function SU_DecodeDir(fp_dirname$,fp_key=SU_FILEKEY)
Local if_verz = 0
Local if_filename$ = ""

If fp_dirname="" Or FileType(fp_dirname)<>2
Return False
EndIf

if_verz = ReadDir(fp_dirname)

Repeat

if_filename = NextFile(if_verz)

If FileType(fp_dirname+if_filename)=1
SU_DecodeFile(fp_dirname+if_filename,fp_key)
EndIf

Until if_filename=""

CloseDir(if_verz)

Return True
End Function
;***********************************************************************************



;***********************************************************************************
; Entfernt alle unverschlüsselten Dateien aus einem Verzeichniss.
; Es wird nach SU_DECODEEXTENSION im Dateinamen gesucht und bei Erfolg wird die Datei gelöscht.
Function SU_ClearDecodedDir(fp_dirname$)
Local if_verz = 0
Local if_filename$ = ""

If fp_dirname="" Or FileType(fp_dirname)<>2
Return False
EndIf

if_verz = ReadDir(fp_dirname)

Repeat

if_filename = NextFile(if_verz)
If FileType(fp_dirname+if_filename)=1
If Instr(fp_dirname+if_filename,SU_DECODEEXTENSION)
DeleteFile(fp_dirname+if_filename)
EndIf
EndIf

Until if_filename=""

CloseDir(if_verz)

Return True
End Function
;***********************************************************************************




;***********************************************************************************
; Funktion zum rausfiltern eines Dateinamens aus einem Pfad
Function SU_GetFilename$(fp_filename$)

; Lokale Variablen die in dieser Funktion benötigt werden

Local if_tempchar$ = ""
Local if_finalfilename$ = ""
Local if_slashpos = 0

; Die Position des letzten Slash wird ermittelt.

For i = 1 To Len(fp_filename)
if_tempchar = Mid(fp_filename,i,1)

If if_tempchar="\" Or if_tempchar="/"
if_slashpos = i
EndIf
Next

; Der Dateiname wird rausgeschnitten und zurück gegeben

if_finalfilename = Mid(fp_filename,if_slashpos+1,255)

Return if_finalfilename
End Function
;***********************************************************************************


Wer fragen hat oder weiter unterstützung braucht kann mir das hier oder per PN mitteilen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Ctuchik

BeitragDo, Sep 02, 2004 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich find es gut, dass Suco-X seine Verschlüsselung hier der Community zur Verfügung stellt, weil es im Forum schon genügend Leute gab, die gefragt haben "Wie verschlüssel ich, dies und das"!

Nachtrag: Für mich ist der Sinn der Verschlüsselung sowieso nicht, dass das ganze unknackbar ist! Ich will lediglich verhindern, dass meine Grafiken und Sounds der breiten Masse frei zugänglich sind. Denn ich bin mir sicher, dass ich schon mit einer einfach Xor-Verschlüsselung 95% der Leute daran hindern kann Grafiken zu klauen! Und ein Profi würde sich sowieso nicht dran setzen sowas zu entschlüsseln, weil es sich einfach nicht lohnt!
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!
  • Zuletzt bearbeitet von Ctuchik am Fr, Sep 03, 2004 1:12, insgesamt einmal bearbeitet

tft

BeitragDo, Sep 02, 2004 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi...

auch wenn ich mich nicht immer mit Suco-x kommentaren anfreunden kann, so ist die Funktions Sammlung eine tolle sache. Wenn jeder seine Sachen mit den neusten Verschlüsselungsverfahren codiren würde. Wäre das mit kannonen auch amöben schiessen.
Smile
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

wunderkind

BeitragFr, Sep 03, 2004 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Frage bei vielen Verschlüsselungs-/ Entschlüsselungsalgorithmen ist doch zum einen, wie erstelle ich einen möglichst sicheren, zufälligen Key und, wichtiger, wie bewahre ich ihn auf?!

Schöne Sammlung ansonsten. Auch wenn sie hier wohl niemand auf Herz und Nieren testet Wink.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group