Dateien schützen

Übersicht BlitzBasic FAQ und Tutorials

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

hamZta

Administrator

Betreff: Dateien schützen

BeitragSa, Apr 17, 2004 1:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, dies ist mein erstes Tutorial, ich hoffe es ist verständlich!
Es geht um die Sicherung von Dateien bei Spielen, zB wenn man seine Bilder vor Bilddieben schützen will.

Es gibt viele Streitigkeiten, welche Methode man benutzen soll, oder ob man sich ein eigenes Grafikformat machen soll...

In diesem Tutorial werden ich über die Verschlüsseln - Entschlüsseln - Laden - Löschen Methode sprechen, die sehr brauchbar ist.

Erklärung: Die Bilder (oder andere Dateien) werden zuerst verschlüsselt. Dann, beim Programmstart, werden die Dateien entschlüsselt, und ganz normal geladen (zB mit Loadimage()). Nach dem Laden werden sie sofort wieder gelöscht, damit keiner an die Dateien gelangt.
Einige behaupten, dass, wenn man schnell genug ist, man die Dateien während dem Laden klauen kann. Wer wirklich so schnell ist, der bekommt von mir einen Keks! (ihr könnt es gerne mal ausprobieren, es wird nicht klappen Wink )

So nun zum Code selbst:
Ich habe hier nicht den kompletten Code geschrieben der nötig ist und alle Bilder zu laden & zu löschen, sondern ich habe die Funktionen zum Verschlüsseln und Entschlüsseln programmiert. (Sollte ein kleiner Tritt zum Weitercoden sein Wink )

Zuerst alle Variablen die benötigt werden:Code: [AUSKLAPPEN]

Global inputFile$                                           
Global Endung$ = "cbm"                          ;Die Endung, die die verschluesselte Datei haben soll
 
Dim key(5)                                      ;Der Schluessel der zum Verschluesseln benutzt wird
key(0)=65                                       ;Der Key wird gefuellt...
key(1)=128                                      ;...
key(2)=35                                       ;...
key(3)=12                                       ;...
key(4)=134                                      ;...
key(5)=23                                       ;...

Als Endung könnt ihr eine beliebe Dateiendung wählen.
Als Verschlüsselungsmethode benutze ich einen 6fach Key, in diesem Fall 65-128-35-12-134-23. Hier kann jeder seine eigenen Zahlen wählen. Mehr dazu später.

Hier die Funktion zum Verschlüsseln der Datei:
Code: [AUSKLAPPEN]

Function codeFile(file$)                        ;Die Verschluessel-Funktion
   Local inputStream
   Local outputStream
   Local outputFile$
   Local cByte
   Local oldEndung$
   Local keyPos

   If FileType(file$) = 0 Then RuntimeError "Datei nicht gefunden!" ;Fehlerueberpruefung
   inputStream = ReadFile(file$)               ;Den inputStream öffnen
   oldEndung$ = Right(file$,3)                 ;Originale Endung auslesen
   outputFile$ = Left(file$,Len(file)-3) + Endung$ ;Die Endung der outputFile$ ändern
   outputStream = WriteFile(outputFile$)
   WriteString outputStream, file$             ;Originalen Pfad in die Datei schreiben
   While Eof(inputStream) = 0                  ;Alle Bytes der Bild-Datei durchgehen
      cByte = ReadByte(inputStream)           ;und einzeln in cByte einlesen
      cByte = cByte Xor key(keyPos)           ;Jetzt das Byte mit dem Key an der aktuellen
      keyPos = keyPos + 1                     ;Stelle(keypos) verschluesseln, keyPos um eins erhoehen
      If keyPos > 5 Then keyPos = 0           ;Wenn keyPos > 5 dann setze keyPos = 0
      WriteByte outputStream, cByte           ;Schreib das verschluesselte Byte in die outputFile
   Wend
   
   CloseFile inputStream                       ;Schließ die Streams wieder
   CloseFile outputStream                      ;sonst kommt es zu Fehlern
End Function

Die meisten Stellen sind auskommentiert, deshalb sage ich hier nicht mehr viel dazu. Es wird zusätzlich zu den Bytes am Anfang der originale Dateipfad als String geschrieben. Diese wird für den Entschlüsslungscode benötigt.

ich möchte nur die verschlüsselung erklären, da die vielleicht unverständlich wirkt:
Code: [AUSKLAPPEN]

Bytes   |   XOR Key
10             65
23             128
43             35
255           12
86             134
32             23
54             65
65             128
76             35
...             ...

Bytes in der Datei sind irgendwelche Bytes die in der Datei eben vorkommen, zB in Bilddateien. Darunter stehen die Werte, mit denen das Byte mittels XOR vershlüsselt wird. (Man erkennt nun, was es mit dem Key auf sich hat: 65-128-35-12-134-23).


Hier noch die Funktion zum Entschlüsseln:
Code: [AUSKLAPPEN]

Function decodeFile(file$)
   Local inputStream
   Local outputStream
   Local outputFile$
   Local cByte
   Local oldEndung$
   Local keyPos

   If FileType(file$) = 0 Then RuntimeError "Datei nicht gefunden!" ;Fehlerueberpruefung
   inputStream = ReadFile(file$)                  ;Verschluesselte Datei oeffnen         
   outputFile$ = ReadString(inputStream)           ;Den originalen pfad der Datei auslesen
   
   
   outputStream = WriteFile(outputFile$)          ;Die neue Datei speichern
   While Eof(inputStream) = 0                     ;Alle Bytes
      cByte = ReadByte(inputStream)              ;auslesen
      cByte = cByte Xor Key(keyPos)              ;und Verschluesseln, wie oben
      keyPos = keyPos + 1                        ;Keypos erhoehen
      If keyPos > 5 Then keyPos = 0              ;und Ueberpruefen.
      WriteByte outputStream, cByte              ;Byte letztendlich in die Datei schreiben 
   Wend
   CloseFile inputStream
   CloseFile outputStream
End Function

Funktioniert im Prinzip genau gleich wie oben. Hier wird der Dateipfad ausgelesen. (somit kann man alle Dateien verschlüsseln, da die Dateiendung erhalten bleibt)

Um das ganze in ein Spiel einzubauen, muss eine List mit Dateien erstellt werden (array) und die dann alle verschlüsselt werden. Am Start des Programms müssen alle Dateien entschlüsselt werden, dann geladen werden und dann gelöscht werden.
dies zu coden, ist aber nicht wirklich anspruchsvoll Wink

[UPDATE]
Ich habe mich entschlossen, das ganze zu vervollständigen, und zu zeigen wie man ne Filelist verwendet:
Code: [AUSKLAPPEN]

Dim files$(99)
Global fileCount = -1
Global listStream = ReadFile("gfx/imglist.lst")
While Not Eof(listStream)
   fileCount = fileCount + 1
   files(fileCount) = ReadLine(listStream)
Wend
CloseFile listStream

Es wird ein Stringarray benötigt, das genügend Platz für mehrere Dateien bietet. fileCount fungiert als "Pointer" der zeigt, wo wir gerade im array sind.
Es wird eine simple Textdatei eingelesen die zb folgenden Inhalt hat:Code: [AUSKLAPPEN]

gfx/tiles/tiles.bmp
gfx/shoot.bmp
...

Die Dateinamen einfach durch einen Zeilenumbruch getrennt hineinschreiben.
Man beachte, das man den Pfad immer von der Codedatei oder dem Programm ausgehend schreiben muss, und nicht von der Textdatei.

Nun geht man zum Verschlüsseln alle Bilder durch:Code: [AUSKLAPPEN]

For i = 0 To fileCount
   If FileType(files(i)) = 1 Then codeFile(files(i))        ;Und die Crypt-Function aufrufen
Next

Es wird überprüft ob die Datei existiert, damit keine Probleme entstehen wenn eine Datei schon verschlüsselt ist oder nicht.

Zum Entschlüsseln:Code: [AUSKLAPPEN]

For i = 0 To fileCount
   tmpFile$ = Left(files(i),Len(files(i))-3) + Endung$
   If FileType(tmpFile$) = 1 Then decodeFile(tmpFile$)  ;Und die deCrypt-Function aufrufen
Next

Hier muss die andere Endung angehängt werden, da wir die Dateien in der Textdatei mit ihrer wirklichen Endung angegeben haben.

zum Löschen der Dateien reicht ein simples:Code: [AUSKLAPPEN]

For i = 0 To fileCount
   DeleteFile files(i)
Next


So, nun erkläre ich den Einsatz dieser Codes:Code: [AUSKLAPPEN]

;Mein tolles Spiel
For i = 0 To fileCount
   tmpFile$ = Left(files(i),Len(files(i))-3) + Endung$
   If FileType(tmpFile$) = 1 Then decodeFile(tmpFile$)  ;Und die deCrypt-Function aufrufen
Next
Graphics 800,600,32,1
setbuffer backbuffer()

global spieler = Loadimage("spieler.bmp")
global ente = Loadimage("ente.bmp")
...
...
For i = 0 To fileCount
   DeleteFile files(i)
Next

repeat
...
...
until keyhit(1)

Also:
1. Dateien entschlüsseln
2. Dateien laden
3. Dateien löschen

Natürlich müssen die Dateien vorher verschlüsselt werden.

ich hoffe ich konnte hier wem helfen!
sollten fragen auftauchen, dann einfach hier rein damit!

hamZta
Blog.

d-bug

BeitragSa, Dez 23, 2006 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
~AUFSPALTUNG~

Keine Diskussionen im FAQ Bereich... Wink

https://www.blitzforum.de/foru...hp?t=21279

cheers

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group