Hallo Zusammen.
Weil ich kein eingenttliches Problem mit einem Skript habe, habe ich den Thread mal im Offtopic erstellt.
Also ich habe mir ein etwas älteres Skript genommen, bei dem ich früher schonmal Hilfe gebraucht hatte und mir Oscar die beste Lösung geliefert hatte:
Datei Verschlüsselung
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
$Form1 = GUICreate("Lenny's FileCrypter", 632, 345, 194, 132, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))
$Pic1 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\Lenny\Eigene Dateien\Lenny's.jpg", 0, 0, 632, 150, BitOR($SS_NOTIFY, $SS_SUNKEN, $WS_GROUP, $WS_BORDER, $WS_CLIPSIBLINGS), $GUI_WS_EX_PARENTDRAG)
$Button1 = GUICtrlCreateButton("Datei zum Verschlüsseln wählen", 40, 160, 243, 25, $WS_BORDER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$Button2 = GUICtrlCreateButton("Datei zum Entschlüsseln wählen", 344, 160, 243, 25, $WS_BORDER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
Global $Input1 = GUICtrlCreateInput("Pfad", 40, 200, 545, 21)
GUICtrlSetState(-1, $GUI_DISABLE)
$Label1 = GUICtrlCreateLabel("0% (0 von 0 KB)", 45, 284, 298, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
Global $Progress1 = GUICtrlCreateProgress(40, 304, 294, 17)
$Button3 = GUICtrlCreateButton("Close me.", 352, 304, 227, 17, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_verschluesseln()
Case $Button2
_entschluesseln()
Case $Button3
Exit
EndSwitch
WEnd
Func _verschluesseln()
Local $iProgress, $iCryptLevel, $sFilePath, $iFileSize, $hSource, $hTarget, $sFileBlock, $iPercent, $old
GUICtrlSetState($Button1, $GUI_DISABLE) ; Button deaktivieren
$sFilePath = FileOpenDialog("Datei zum Verschlüsseln auswählen", "", "Alle Dateien (*.*)", 1)
If Not @error Then
GUICtrlSetData($Input1, $sFilePath)
$iFileSize = FileGetSize($sFilePath) ; Dateigröße auslesen
$hSource = FileOpen($sFilePath, 16) ; Quelldatei im Binary-Mode öffnen
$hTarget = FileOpen($sFilePath & ".lfc", 2 + 8 + 16) ; Zieldatei im Binary-Mode zum Schreiben öffnen
While True
$sFileBlock = FileRead($hSource, 64) ; einen 64 Byteblock aus der Quelldatei lesen
If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; den Block verschlüsseln und speichern;
$iProgress += 64 ; Wert für die Progressbar addieren
$iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
If $iPercent <> $old Then
GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
$old = $iPercent
EndIf
WEnd
FileClose($hTarget) ; Zieldatei schließen
FileClose($hSource) ; Quelldatei schließen
GUICtrlSetData($Label1, "100% (fertig!)") ; Label auf 100% setzen
GUICtrlSetData($Progress1, 100) ; Progressbar auf 100% setzen
EndIf
GUICtrlSetState($Button1, $GUI_ENABLE) ; Button wieder aktivieren
EndFunc ;==>_verschluesseln
Func _entschluesseln()
Local $iProgress, $iCryptLevel, $sFilePath, $iFileSize, $hSource, $hTarget, $sFileBlock, $sPos, $sTarget, $iPercent, $old
GUICtrlSetState($Button2, $GUI_DISABLE) ; Button deaktivieren
$sFilePath = FileOpenDialog("Wählen sie die Datei zum DeCrypten aus", "", " (*.lfc)", 1)
If Not @error Then
GUICtrlSetData($Input1, $sFilePath)
$iFileSize = FileGetSize($sFilePath) ; Dateigröße auslesen
$hSource = FileOpen($sFilePath, 16) ; Quelldatei im Binary-Mode öffnen
$sTarget = StringTrimRight($sFilePath, 4) ; Dateiendung (.lfc) entfernen
If FileExists($sTarget) Then ; Wenn die Zieldatei bereits existiert, dann...
$sPos = StringInStr($sTarget, ".", 0, -1) ; Position der Dateiendung
$sTarget = StringLeft($sTarget, $sPos - 1) & "_Neu." & StringRight($sTarget, StringLen($sTarget) - $sPos) ; "_Neu" hinzufügen
EndIf
$hTarget = FileOpen($sTarget, 2 + 8 + 16) ; Zieldatei im Binary-Mode öffnen
While True
$sFileBlock = FileRead($hSource, 64) ; eine Zeile aus der Quelldatei lesen
If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; die Zeile entschlüsseln und speichern
$iProgress += 64 ; Wert für die Progressbar addieren
$iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
If $iPercent <> $old Then
GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
$old = $iPercent
EndIf
WEnd
FileClose($hTarget) ; Zieldatei schließen
FileClose($hSource) ; Quelldatei schließen
GUICtrlSetData($Label1, "100% (fertig!)") ; Label auf 100% setzen
GUICtrlSetData($Progress1, 100) ; Progressbar auf 100% setzen
EndIf
GUICtrlSetState($Button2, $GUI_ENABLE) ; Button wieder aktivieren
EndFunc ;==>_entschluesseln
Func _BlockEncrypt($sCryptBlock, $sPass)
Local $sOut = "", $iPassLen = StringLen($sPass), $j = 1, $sTemp
For $i = 3 To StringLen($sCryptBlock) Step 2
$sTemp = Asc(StringMid($sPass, Mod($j, $iPassLen), 1))
$sOut &= Chr(BitXOR(Dec(StringMid($sCryptBlock, $i, 2)), $sTemp, Abs($iPassLen - $i)))
$j += 1
Next
Return $sOut
EndFunc ;==>_BlockEncrypt
Es geht um den Bereich ab Func _verschluesseln().
Genau um dieses Stück:
[autoit]$hTarget = FileOpen($sFilePath & ".lfc", 2 + 8 + 16) ; Zieldatei im Binary-Mode zum Schreiben öffnen ;HIER
While True
$sFileBlock = FileRead($hSource, 64) ; einen 64 Byteblock aus der Quelldatei lesen ; HIER
If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; den Block verschlüsseln und speichern;
$iProgress += 64 ; Wert für die Progressbar addieren
$iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
If $iPercent <> $old Then
GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
$old = $iPercent
EndIf
WEnd
Dort wird ein 64 Byte Block aus der Datei gelesen. Warum klappt das auch wenn die Dateigröße nicht durch 64 teilbar ist?
Zb haben wir 160byte: Nach 2 mal 64byte auslesen sind ja nur noch 32byte übrig.
Oder ließt FileRead, wenn weniger bytes als die als Parameter angegebene Größe vorhanden sind, nur noch soviel wie da sind ?
Vielen Dank im Voraus,
Lenny