Verschlüsselung und Datenzusammenlegung [fixed]

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

nils2771989

Betreff: Verschlüsselung und Datenzusammenlegung [fixed]

BeitragSo, März 23, 2008 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ho....

Ich hab mich für mein momentanes Projekt mit dem Verschlüsseln bzw zusammenlegen von Dateien beschäftigt.
Das Ergebnis will ich mal veröffentlichen, vlt ist es auch noch für anderen von Nutzen

Zur Beschreibung:

Wenn man eine Datei verschlüsseln will, muss man einfach einen Dateinamen und ein Passwort eingeben.
Bei dem Namen werden alle Dateien im aktuellen Verzeichnis durchgegangen und alle Dateien, die den entsprechenden Dateinamen von Links her gelesen haben, werden mit eingebunden.

Z.b. Man gibt "Spiel" ein, dann werden z.b. "Spiel.exe","Spiel_bild.bmp" eingebunden, wenn man "Spiel.exe" eingibt, wird nur "Spiel.exe" eingebunden
Die Verschlüsselten Dateien werden aber nicht gelöscht, nachdem sie verpackt wurden(um Datenverlust zu vermeiden Razz )

Beim entpacken/entschlüsseln werden die in der gelesenen Datei enthaltenen Dateien Aufgelistet und man kann sich entscheiden, welche davon nun extrahiert werden soll. Man kann aber auch alle Dateien auf einmal entpacken.

Code: [AUSKLAPPEN]

Global key$,length      ;Passwort
Global counter%=1      ;Variable für Passwort
Global leng[20]         ;Einzelne Werte für das Passwort
Global size,name$      ;Groesse und Name
Global searchname$

;Type für die einzulesende/auszugebende Dateien
Global file.file
Type file
   Field fullname$
   Field position%
   Field size%
End Type

;Die Methode auswaehlen
Print "Verschlüsseln(1) oder Entschlüsseln(2)?"
do$ = Input$()

;Passwort und Dateien einlesen
If do$="1"
   searchname$=Input$("Name der Datei:")   
   Code()
Else If do$="2"
   searchname$=Input$("Name der Datei:")
   
   Decode()
EndIf

Function Code()

;Variable zum Testen ob Dateien vorhanden
Filetest=False

;Die entsprechenden Dateien herraussuchen
dir$=ReadDir(CurrentDir())
Repeat
   ReadFiles$=NextFile$(dir$)
      If ReadFiles$=""   Then Exit
   If Lower( Left( readfiles$, Len(searchname))) = searchname And FileType(CurrentDir()+ReadFiles)=1  And Lower( Right( readfiles$, 3))<>"ash"
      file=New file
      file\fullname=ReadFiles
      filetest=True
   EndIf    
Forever

;Das Verzeichnis schließen
CloseDir dir$

If Not filetest
   Print "Keine entsprechenden Dateien gefunden"
   Print "Beliebige Taste zum Beenden drücken"
   WaitKey()
   End
EndIf    

;Passwort zum Verschluesseln abfragen
key$=Input("Das Passwort: ")

;Das Passwort in einem Array speichern
For i=1 To Len(key$)
   leng[i]=Asc(Mid(key$,i))
Next

;Datei zum schreiben oeffnen
settings=WriteFile(searchname+".ash")

;Fuer jede gefundene Datei ausfuehren
For file.file=Each file
   
   fileread=ReadFile(file\fullname)

   ;Groesse der Datei ermitteln
   size=FileSize(file\fullname)
   
   ;Name und groesse schreiben
   WriteString settings,file\fullname
   WriteInt settings,size

   ;Fuer jedes Byte ausfuehren
   For i=1 To size

      ;Byte auslesen
      ent=ReadByte (fileread)
      
      ;Wert veraendern
      ent=ent-leng[counter]+leng[Len(key$)+1-counter]
 
      ;Variable zwischen 0 und 255 halten
         If ent<0   
            ent=ent+256
         Else If ent>255
            ent=ent-256
         EndIf
      
      ;Byte schreiben
      WriteByte settings,ent

      ;Zahl fuer Veraenderung des Passwortes
      dest=dest+(Len(key$)-counter)
         If dest<0
            dest=Len(key$)-dest   
         Else If dest>Len(key$)
            dest=dest-Len(key$)      
         EndIf
      
      ;Passwort veraendern
      leng[counter]=leng[counter]+leng[dest]
         If leng[counter]<0   
            leng[counter]=leng[counter]+256
         Else If leng[counter]>255
            leng[counter]=leng[counter]-256
         EndIf
         
         counter=counter+1
         If counter>Len(key$)
            counter=1
         EndIf    

   Next

   ;Geschrieben Datei anzeigen und schliessen
   Print file\fullname
   
   CloseFile fileread   
Next

;Geschriebene Datei schliessen
CloseFile settings

;Types loeschen
For file.file=Each file
   Delete file.file
Next   

Print "Datei geschrieben, beliebige Taste zum beenden"
WaitKey()
 
End Function

; Funktion zum Entschluesseln der Dateien
Function DeCode()

;Das Passwort in einem Array speichern
key$=Input("Das Passwort: ")
For i=1 To Len(key$)
   leng[i]=Asc(Mid(key$,i))
Next
length=Len(key$)

settings = ReadFile(searchname+".ash")

If settings=False
   Print "Keine entsprechenden Dateien gefunden"
   Print "Beliebige Taste zum Beenden drücken"
   WaitKey()
   End
EndIf



;Enthaltene Dateien ermitteln
Print "Enthaltene Dateien:"   
   Repeat
   file=New file
   file\fullname=ReadString(settings)
   file\position=size
   size=size+Len(file\fullname)+4
   ent=ReadInt(settings)
   file\size=ent
   size=size+ent+4
    
   Print "  "+Handle(file.file)+"."+file\fullname

   SeekFile(settings,size)   
   Until Eof(settings)

size=0   
Print "Nummer um entsprechende Datei zu entschlüsseln"
Print "0 um alle zu entschlüsseln"

datei%=Input$()

;Ermittlung für die Veraenderung des Passwortes
For i=1 To datei-1
   file.file=Object.file(i)
   size=size+file\size
Next

If datei=0
   SeekFile(settings,0)
   size=0
Else
   file.file=Object.file(datei%)
   SeekFile(settings,file\position)
EndIf

;Der vorgang ist zwar recht langwierig, muss aber sein um das Passwort anzupassen
For i=1 To size

   ;Die Zahl fuer die Variation vom Passwort aendern
   dest=dest+(length-counter)
      If dest<0
         dest=length-dest   
      Else If dest>length
         dest=dest-length      
      EndIf      
         
   ;Das Passwort beim Auslesen Variiren
   leng[counter]=leng[counter]+leng[dest]
      If leng[counter]<0   
         leng[counter]=leng[counter]+256
      Else If leng[counter]>255
         leng[counter]=leng[counter]-256
      EndIf

      counter=counter+1
      If counter>length
         counter=1
      EndIf
Next
   
   ;Hauptschleife fuer gesamte Datei
   Repeat
      
      ;den Dateinamen auslesen
      name=ReadString(settings)
       
      ;Länge der enthaltenen Datei auslesen
      size=ReadInt(settings)
            
      ;Datei zum schreiben erstellen   
      testwrite=WriteFile(name)
      
      ;Unterschleife für einzelne Dateine
      For i=1 To size
         ;Das Byte auslesen und entsprechend dem Code veraendern
         ent=ReadByte(settings)   
         versch=ent
         ent=ent+leng[counter]-leng[length+1-counter]
         
            ;dafuer sorgen, dass die Variable innerhalb der 1 Byte Grenze bleibt
            If ent<0
               ent=ent+256
            Else If ent>255
               ent=ent-256
            EndIf

         WriteByte testwrite,ent
         
         ;Die Zahl fuer die Variation vom Passwort aendern
         dest=dest+(length-counter)
            If dest<0
               dest=length-dest   
            Else If dest>length
               dest=dest-length      
            EndIf      
         
         ;Das Passwort beim Auslesen Variiren
         leng[counter]=leng[counter]+leng[dest]
            If leng[counter]<0   
               leng[counter]=leng[counter]+256
            Else If leng[counter]>255
               leng[counter]=leng[counter]-256
            EndIf
      
            counter=counter+1
            If counter>length
               counter=1
            EndIf
      
      Next
      
      ;Dateien schliessen
      CloseFile testwrite

Until Eof(settings) Or datei<>0

;Geschriebene Datei schliessen
CloseFile settings

;Types loeschen
For file.file=Each file
   Delete file.file
Next

Print "Datei(en) extrahiert, beenden mit beliebiger Taste"
WaitKey()
End Function

End


Ich weiß, die Verschlüsselung lässt zu wünschen übrig und könnte leicht geknackt werden, wenn ich zeit habe, werde ich mal versuchen diese zu verbessern.

Edit: Sry es hatte sich wohl ein Fehler bei der Entschlüsselung eingeschlichen...müsste jetzt ohne Probleme gehen Wink
Schummle nicht, aber spiele nach eigenen Regeln.
Sei nicht verrückt, sondern einfach nur wahnsinnig.
Sei nicht böse, führ nur nichts Gutes im Schilde.
Verändere dich nicht, bleib immer anders.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group