Dateiverschlüsselung

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Dateiverschlüsselung

Beitrag 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
Zuletzt geändert von Olaf am 29.06.2006 12:57, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Dateiverschlüsselung

Beitrag 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
a²+b²=mc²
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Vorsicht, das Programm ist nicht zu empfehlen. Der Verschlüsselung ist
alles andere als sicher.
Bild
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Was soll das heißen?

Wie leicht ist es denn zu knacken?
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Ich verwende eigentlich nur Base64. Ist zwar nicht passwortgesichert, aber trotzdem schnell und einfach, oder? 8)
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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:
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

ok sry :lol:
dann werd ich eben mal eine eigene "hochsicherheitsverschlüsselung" entwerfen....
Bild
Antworten