Halli Hallo,
Ich hatte in letzer Zeit ein wenig langeweile und zu wenig zu tun. Irgendwie bin ich dann darauf gekommen schon lange nichts mehr mit AutoIT geschrieben zu haben.
Nach ein par Stunden chatten mit einem kollegen ist mir dann auch endlich eine idee gekommen was ich machen könnte.
Hide my Stuff
Funktionsweise:
Die Dateinamen werden verschlüsselt und mit der endung *.tmp abgespeichert. Praktischerweise können sie auch direkt wieder entschlüsselt werden.
Die Datei selbst wird nicht verändert, es ist also trotzdem noch möglich die Datei zu öffnen (mit dem richtigen Programm) oder auch wieder um zu benennen.
Es werden immer ALLE Dateien im Ordner verschlüsselt. Unterordner werden ignoriert!
Es wird eine 0000test.tmp1 datei angelegt um die verschlüsselung zu testen (und wird nach den entschlüsseln wieder gelöscht)
Versteckte Dateien werden erkannt und verschlüsselt (bleiben versteckt). Allerdings können versteckte Ordner nicht ausegwählt werden.
Quick: in einer settings Datei können standard passwort und Pfad festgelegt werden.
Sinn der Sache:
Schliesst Dateien aus der Suche nach Dateinamen/typ aus.
Verhindert das Bilder/Videos via medien index indiziert werden.
Bugs:
Bereits verschlüsselte Dateien können ein zweites und drites und viertes mal verschlüsselt werden.
Es können nur ganze ordner verschlüsselt werden die nicht schon verschlüsselte dateien beinhalten. (Diese werden sonst doppelt verschlüsselt)
Sollten sich besondere Zeichen im Dateinamen befinden kann die verschlüsselung evtl übersprungen werden.
To do:
Irgend eine möglichkeit finden beim encrypt1() die .tmp dateien aus dem array der gefundenen Dateien zu löschen!(Irgendjemand gerade eine Idee wie? _arraybinarysearch und _arraydfindall funktioniert nicht)
Suchindex überarbeiten das eine Auswahlliste erscheint welche dateien in dem Ordner man verschlüsseln will und welche nicht.
Evtl den Kopf der Datei löschen und in der Check datei abspeichern, damit die Dateien gar nicht mehr geöffnet werden können. (dies würde aber wohl die Performance beeinträchtigen... ich hab nun 1.5gb (256 dateien) in rund 5 sekunden verschlüsselt.)
Spoiler anzeigen
Quellcode:
#include <Array.au3>
#Include <File.au3>
#include <String.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
Global $dateipfad, $code
#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("Hide my Stuff", 256, 120, -1, -1)
$code = GUICtrlCreateInput("password", 8, 32, 233, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
$ButtonEncrypt = GUICtrlCreateButton("Encrypt", 86, 64, 75, 25, 0)
$ButtonDecrypt = GUICtrlCreateButton("Decrypt", 159, 64, 75, 25, 0)
$EnterPassLabel = GUICtrlCreateLabel("Enter password", 8, 12, 77, 17)
$ButtonFolder = GUICtrlCreateButton("Folder", 8, 64, 65, 25, 0)
$Checkbox1 = GUICtrlCreateCheckbox("Quick", 16, 96, 45, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $ButtonEncrypt
If GUICtrlRead( $Checkbox1) = $GUI_CHECKED Then
$code = IniRead("settings", "quick", "code", "password")
$dateipfad = IniRead("settings", "quick", "dateipfad", "")
EndIf
encrypt1()
MsgBox(0, "Done", "Folder: "&$dateipfad&" encrypted")
Case $ButtonDecrypt
If GUICtrlRead( $Checkbox1) = $GUI_CHECKED Then
$code = IniRead("settings", "quick", "code", "password")
$dateipfad = IniRead("settings", "quick", "dateipfad", "")
EndIf
decrypt1()
MsgBox(0, "Done", "Folder: "&$dateipfad&" decrypted")
Case $ButtonFolder
$dateipfad= FileSelectFolder( "Ordner Auswählen", @HomePath, 4)
EndSwitch
WEnd
Func encrypt1()
$nr = 1
$orinames =_FileListToArrayMultiSelect($dateipfad,"*",",",1)
_ArrayDisplay ($orinames, "Files to encrypt") ;shows all files in folder, deactivate if you don't like it
FileWrite($dateipfad&"\0000"&(_StringEncrypt(1, "test", $code)&".tmp1"),"0") ;create password check
Do
$oriname = _ArrayToString($orinames, "",$nr, $nr)
$orinameC = _StringEncrypt( 1, $oriname, $code)
;~ MsgBox(0, "", $oriname&@CRLF&$orinameC&".tmp")
FileMove($dateipfad&"\"&$oriname, $dateipfad&"\"&$orinameC&".tmp", 1)
$nr = $nr+1
Until $nr >= $orinames[0]+1
EndFunc
Func decrypt1()
$nr =1
$orinamesDC =_FileListToArrayMultiSelect($dateipfad,"*.tmp1",",",1) ;check for correct password, start
$orinameDC = _ArrayToString($orinamesDC, "",1, 1)
$orinameDCC = StringTrimLeft((StringTrimRight($orinameDC,5)),4)
;~ _ArrayDisplay ($orinamesDC)
If _StringEncrypt( 0, $orinameDCC, $code) <> "test" Then
MsgBox(0, "Error", "Wrong password")
Exit
Else
FileDelete($dateipfad&"\0000"&$orinamedcc&".tmp1")
$orinamesDC =_FileListToArrayMultiSelect($dateipfad,"*.tmp",",",1) ;end of password check
;~ _ArrayDisplay ($orinamesDC)
EndIf
Do
$orinameDC = _ArrayToString($orinamesDC, "",$nr, $nr)
$orinameDCC= StringRegExpReplace( $orinameDC, ".tmp", "")
$orinameD = _StringEncrypt( 0, $orinameDCC, $code)
;~ MsgBox(0, "", $orinameDC&@CRLF&$orinameD)
FileMove( $dateipfad&"\"&$orinameDC, $dateipfad&"\"&$orinameD, 1)
$nr = $nr+1
Until $nr >= $orinamesDC[0]+1
EndFunc
Func _FileListToArrayMultiSelect($dir,$searchlist,$Separator,$iFlag = 0)
Local $FileList[1] = [0], $Filelist1, $iN, $Num, $search
$search = StringSplit($searchlist, $Separator)
If $search[0] > 0 Then
For $iN = 1 To $search[0]
$Filelist1 = _FileListToArray($dir, $search[$iN], $iFlag)
If Not @error Then
$Num = UBound($FileList)
_ArrayConcatenate($FileList, $Filelist1)
$FileList[0] = $FileList[0] + $FileList[$Num]
_ArrayDelete($FileList, $Num)
EndIf
Next
EndIf
Return $FileList
EndFunc
Jegliche Rückmeldungen sind willkommen!
mfg
Haldi