Seite 1 von 2

Dateiverschlüsselung

Verfasst: 29.06.2006 11:54
von Olaf
8)

Code: Alles auswählen

;Dies ist ein (kleines und sehr einfaches) Programm zur Dateiverschlüsselung (hat aber bei größeren Dateien noch Probleme).
;Beim Ver- und Entschlüsseln wird Das Passwort in den Verschlüsselungsalgorithmus mit eingebunden, was bedeutet, das verschlüsselte Dateien
;mit jedem Passwort "entschlüsselt" werden können, ohne dass eine Fehlermeldung ausgegeben wird :-). Allerdings steht bei einem falschen Passwort
;in den "entschlüsselten" Dateien nur Schwachsinn.

;Benötigt Version 4.00 oder muss für niedrigere Versionen massiv umgeschrieben werden.

File$=ProgramParameter() ;unterstützt das Standardmäßige Öffnen der ".krypt"-Dateien nach einmaligem Eintrag durch das "Öffnen mit..."-Menü von Windows:
												 ;als Programm exe-Datei des Kompilierten Quellcodes angeben und das Häkchen von "Dateityp immer mit dem ausgewählten Programm öffnen" setzen.

Enumeration
	#Window			;Hauptfenster
	#Dateiname	;Gadget für Pfad und Namen der zu verschlüsselnden Datei
	#PT
	#Passwort		;Input-Gadget für das zukünftige Passwort
	#Select			;Dateiauswahlgadget
	#Mode				;Auswahlgadget für Ver-/Entschlüsselung
	#Start			;Startgadget
	#Progress		;Fortschrittsanzeige
	#Text
        #File1
	#File2
EndEnumeration

Procedure Krypt(Datei$,Passwort$,Modus$)
If ReadFile(#File1,Datei$) 							;Lesendes Öffnen der zu verschlüsselnden Datei
	Attributes=GetFileAttributes(Datei$)	;Einlesen der Dateiattribute
	Length=Lof(#File1)										;Bestimmung der Dateilänge
	SetGadgetAttribute(#Progress,#PB_ProgressBar_Maximum,Length) ;Umstellung der Fortschrittsanzeige
	Enumeration #PB_Compiler_EnumerationValue
		#Attribute
		#Schreibschutz
		#Versteckt
		#Systemdatei
		#Ok
	EndEnumeration
	OpenWindow(#Attribute,0,0,120,100,"Krypt - Attribute",#PB_Window_WindowCentered,WindowID(#Window)) ;Fenster für zukünftige Datei-Attribute
	StickyWindow(#Attribute,1)
	  AddKeyboardShortcut(#Attribute,#PB_Shortcut_Return,#Ok)
		CreateGadgetList(WindowID(#Attribute))
			CheckBoxGadget(#Schreibschutz,10,10,100,20,"Schreibschutz") ;Schreibschutz-Optionsgadget
				If Attributes & #PB_FileSystem_ReadOnly
					SetGadgetState(#Schreibschutz,1)
				EndIf
			CheckBoxGadget(#Versteckt,10,30,100,20,"Versteckt")         ;Versteckt-Optionsgadget
				If Attributes & #PB_FileSystem_Hidden
					SetGadgetState(#Versteckt,1)
				EndIf
			CheckBoxGadget(#Systemdatei,10,50,100,20,"Systemdatei")     ;Systemdatei-Optionsgadget
				If Attributes & #PB_FileSystem_System
					SetGadgetState(#Systemdatei,1)
				EndIf
			ButtonGadget(#Ok,10,73,100,20,"OK")
	Repeat
	StickyWindow(#Attribute,1)
		event=WaitWindowEvent()
			Select event
				Case #PB_Event_Menu
				  Select EventMenu()
				    Case #Ok          ;Return-Taste wurde gedrückt
				      Goto OK
				  EndSelect
				Case #PB_Event_Gadget
					Select EventGadget()
						Case #Ok
						  OK:             ;Einstellungen zwischenspeichern und fortfahren
							Schreibschutz=GetGadgetState(#Schreibschutz)
							Versteckt=GetGadgetState(#Versteckt)
							Systemdatei=GetGadgetState(#Systemdatei)
							Break
					EndSelect
			EndSelect
	ForEver
	CloseWindow(#Attribute)
	
	Select Modus$
		Case "verschlüsseln"
			Value=1               ;Wert zur Verschlüsselung im Algorithnus
		Case "entschlüsseln"
			Value=-1              ;Wert zur Entschlüsselung im Algorithnus
	EndSelect
	
	File$=Datei$
	
	If Value=1        ;von hier an bis zursprungmarke "Again:" findet die Überprüfung statt, ob es sich um eine verschlüsselte Datei handelt (Dateierweiterungs-basiert)
		V:
		If GetExtensionPart(File$)<>"krypt"
			New$=File$+".krypt"
		Else
			MessageRequester("Krypt! - ACHTUNG","Da die Datei bereits verschlüsselt ist, wird der Modus von "+Chr(34)+"verschlüsseln"+Chr(34)+" auf "+Chr(34)+"entschlüsseln"+Chr(34)+" umgestellt.")
			Value=-1
			Goto E
		EndIf
	ElseIf Value=-1
		E:
		If GetExtensionPart(File$)="krypt"
			New$=Left(File$,Len(File$)-6)
		Else
			MessageRequester("Krypt! - ACHTUNG","Da die Datei noch nicht verschlüsselt ist, wird der Modus von "+Chr(34)+"entschlüsseln"+Chr(34)+" auf "+Chr(34)+"verschlüsseln"+Chr(34)+" umgestellt.")
			Value=1
			Goto V
		EndIf
	EndIf
	Again:
	If CreateFile(#File2,New$)<>0  ;Erstellen der neuen Datei
	Else
		Res=MessageRequester("Krypt! - ERROR","Fehler beim Erstellen der Datei "+Chr(34)+New$+Chr(34)+" !"+Chr(10)+"Möglicherweise ist der Datenträger schreibgeschützt oder Sie besitzen"+Chr(10)+"keine Berechtigungen die Datei in diesem Ordner zu erstellen."+Chr(10)+"Möchten Sie die Datei in ein anderes Verzeichnis "+Modus$+" ?",#PB_MessageRequester_YesNo)
		If Res=#PB_MessageRequester_Yes
			Path$=PathRequester("Krypt! - Neuen Pfad auswählen",GetPathPart(New$))
			New$=Path$+GetFilePart(New$)
			Goto Again
		Else
			ProcedureReturn 0
		EndIf
	EndIf
	
	SetGadgetText(#Text,UCase(Mid(Modus$,1,1))+Mid(Modus$,2,2)+"schlüsselung läuft...") ;Aktualisierung im Hauptfenster
	If Passwort$<>""
		Passwortlength=Len(Passwort$)
		While Eof(#File1)=0     ;solange das Ende der Datei noch nicht erreicht ist...
			Byte=ReadByte(#File1)  ;Byte aus Originaldatei einlesen
			Byte=(Byte+Value*(Asc(Mid(Passwort$,i,1))+Length))%256 ;Bytewert verändern(eigentliche Verschlüsselung):Modulo 256 von (Bytewert+/-Asciiwert des Buchstabens des Passwortes an der Stelle i +/- Orginaldateilänge)
			WriteByte(#File2,Byte)  ;schreiben des veränderten Wertes in die neue Datei
			pos+1 ;Zeiger in den Dateien erhöhen
			If pos % 1000=0
				Delay(10)
			EndIf
			SetGadgetState(#Progress,pos) ;Fortschrittsanzeige aktualisieren
			i+1 ;Zeiger im Passwort erhöhen
			If i>Passwortlength ;Wenn Zeiger>Passwortlänge...
				i=1               ;von vorn anfangen
			EndIf
		Wend
	Else   ;ohne Passwort:
		While Eof(#File1)=0
			Byte=ReadByte(#File1)
			Byte=(Byte+Value*Length)%256 ;Modulo 256 von (Bytewert+/-Originaldateilänge)
			WriteByte(#File2,Byte)
			pos+1
			If pos % 1000=0
				Delay(10)
			EndIf
			SetGadgetState(#Progress,pos)
		Wend
	EndIf
	SetGadgetText(#Text,"Krypt!")   ;Fertig!!!
	SetGadgetState(#Progress,0)
	SetGadgetText(#Passwort,"")
	CloseFile(#File1)
	CloseFile(#File2)
	If Schreibschutz=1
		NA=#PB_FileSystem_ReadOnly
	EndIf
	If Versteckt=1
		NA|#PB_FileSystem_Hidden
	EndIf
	If Systemdatei=1
		NA|#PB_FileSystem_System
	EndIf
	SetFileAttributes(New$,NA)    ;Dateiattribute setzen
	If MessageRequester("Krypt! - FERTIG",UCase(Mid(Modus$,1,1))+Mid(Modus$,2,2)+"schlüsselung abgeschlossen."+Chr(10)+"Soll die Originaldatei gelöscht(!) werden ?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes  ;Nachfrage zum löschen der Originaldatei
		SetFileAttributes(Datei$,0)
		If DeleteFile(Datei$)=0   ;Originaldatei löschen
			MessageRequester("Krypt! - ERROR","Originaldatei konnte nicht gelöscht werden. Möglicherweise ist der Datenträger schreibgeschützt oder Sie besitzen"+Chr(10)+"keine Berechtigungen die Datei zu löschen.")
		Else
			SetGadgetText(#Dateiname,"")
		EndIf
	EndIf
	ProcedureReturn 1
Else
	MessageRequester("Krypt! - ERROR","Fehler beim öffnen der Datei "+Chr(34)+Datei$+Chr(34)+" !"+Chr(10)+"Bitte überprüfen Sie, ob die Datei vorhanden ist.")
	ProcedureReturn 0
EndIf

EndProcedure

OpenWindow(#Window,0,0,450,100,"Krypt!",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
	AddKeyboardShortcut(#Window,#PB_Shortcut_Return,#Start)
	CreateGadgetList(WindowID(#Window))
		StringGadget(#Dateiname,10,10,250,20,File$)
		TextGadget(#PT,10,43,50,20,"Passwort :")
		StringGadget(#Passwort,65,40,195,20,"",#PB_String_Password)
		ButtonGadget(#Select,270,10,170,20,"Datei auswählen")
		ComboBoxGadget(#Mode,270,40,105,20)
			AddGadgetItem(#Mode,0,"verschlüsseln")
			AddGadgetItem(#Mode,1,"entschlüsseln")
			SetGadgetState(#Mode,0)
		ButtonGadget(#Start,385,40,55,20,"Krypt!")
		ProgressBarGadget(#Progress,10,70,430,12,0,1000)
		TextGadget(#Text,10,83,430,20,"Krypt!")
Repeat
	event=WaitWindowEvent()
		Select event
			Case #PB_Event_Menu
				Select EventMenu()
					Case #Start
						Goto Enter
				EndSelect
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #Select
						File$=OpenFileRequester("Krypt!","","Alle Dateien (*.*)|*.*",0)
						SetGadgetText(#Dateiname,File$)
						SetActiveGadget(#Dateiname)
					Case #Dateiname
						If GetExtensionPart(GetGadgetText(#Dateiname))="krypt"
							SetGadgetState(#Mode,1)
						Else
							SetGadgetState(#Mode,0)
						EndIf
						SetGadgetText(#Text,"Dateiname : "+GetGadgetText(#Dateiname))
					Case #Start
						Enter:
						File$=GetGadgetText(#Dateiname)
						Passwort$=GetGadgetText(#Passwort)
						Mode$=GetGadgetText(#Mode)
						Is=Krypt(File$,Passwort$,Mode$)
						If Is=0
							MessageRequester("Krypt! - ERROR","Vorgang fehlgeschlagen!")
						EndIf
				EndSelect
		EndSelect
Until event=#PB_Event_CloseWindow

Re: Dateiverschlüsselung

Verfasst: 29.06.2006 12:22
von Kiffi
Hai Olaf,

finde ich immer wieder klasse, wenn ein neues Mitglied im Board mit
einem nützlichen Code seinen Einstand gibt! :allright:

Auf die Schnelle mal ein paar Worte zum Code:

* Hast Du den Code, so wie Du ihn gepostet hast, schon mal versucht zu
starten? Ich bekomme da ein 'Constant not found: #File1'. ;-)

* Es bringt keinen besonderen Vorteil, wenn Du in Deinem Code zwei
Enumerationen verwendest. Packe alle Konstanten in eine Enumeration.

* Comboboxen machen nur dann Sinn, wenn man darin ein Eintrag aus
mehreren Elementen auswählen kann. Die Combobox 'Verschlüsseln /
Entschlüsseln' verwirrt, weil ja (je nach ausgewählter Datei) nur ein
Eintrag anwählbar ist. Mein Vorschlag: Combobox weg und dafür dann den
Button rechts daneben je nach Aktion mit 'Verschlüsseln' oder
'Entschlüsseln' betexten.

> ;Dies ist ein (kleines und sehr einfaches) Programm zur
> Dateiverschlüsselung (hat aber bei größeren Dateien noch Probleme).

Was heisst 'größere Dateien'? 1 Megabyte? 10 Megabyte? 1 Terabyte? ;-)

* Du solltest nach Möglichkeit so wenig GOTOs wie möglich in Deinem
Code verwenden. GOTO-Code wird schnell unübersichtlich.

Wenn Du magst, dann könnte ich Dir noch ein paar weitere kontruktive
Vorschläge zur Verbesserung des Codes geben.

Ansonsten: Weiter so!

Grüße ... Kiffi

Verfasst: 29.06.2006 15:11
von MVXA
Vorsicht, das Programm ist nicht zu empfehlen. Der Verschlüsselung ist
alles andere als sicher.

Verfasst: 29.06.2006 18:08
von Alves
Was soll das heißen?

Wie leicht ist es denn zu knacken?

Verfasst: 29.06.2006 19:42
von Deeem2031
Also wenn du nicht unbedingt deine Kontonummern verschlüsseln willst reicht das schon - unter "alles andere als sicher" würde ich mir was anderes vorstellen.

Verfasst: 29.06.2006 19:47
von Jilocasin
Ich verwende eigentlich nur Base64. Ist zwar nicht passwortgesichert, aber trotzdem schnell und einfach, oder? 8)

Verfasst: 29.06.2006 20:24
von Thorium
Jilocasin hat geschrieben:Ich verwende eigentlich nur Base64. Ist zwar nicht passwortgesichert, aber trotzdem schnell und einfach, oder? 8)
Base64 ist garkeine Verschlüsslung, das ist nur eine Codierung. Bevor ich was mit Base64 verschlüsslen würde, würd ich es lieber mit XOr verschlüsseln. Ist beides nicht sicher aber Xor ist wesentlich schneller. :wink:

Verfasst: 29.06.2006 20:33
von Deeem2031
Jilocasin hat geschrieben:Ich verwende eigentlich nur Base64. Ist zwar nicht passwortgesichert, aber trotzdem schnell und einfach, oder? 8)
Das würde ich als "alles andere als sicher" bezeichnen :lol:

>Ist beides nicht sicher aber Xor ist wesentlich schneller.

Das soll doch ned heißen Base64 wär genauso sicher wie Xor-Verschlüsselung? Gegen Base64 ist Xor eine Hochsicherheitsverschlüsselung ;)

Verfasst: 29.06.2006 20:51
von remi_meier
Xor ist AFAIK die sicherste Verschlüsslungsmethode, sofern die Länge des
Schlüssels mindestens der des zu verschlüsselnden Textes entspricht.

:mrgreen:

Verfasst: 29.06.2006 20:51
von Jilocasin
ok sry :lol:
dann werd ich eben mal eine eigene "hochsicherheitsverschlüsselung" entwerfen....