/*
В пин коде допустимы цифры, и регистрозависимые буквы латинского алфавита.
Длинна пин кода может быть любой длинны.
Если файл кодируется, то файл-шифр создаётся в той же папке с добавлением ".crypt"
к имени файла. Файл-шифр всегда бинарный. Кодировать можно любые типы файлов,
с сохранением кодировки.
Если файл декодируется, то файл-шифр должен иметь расширение "crypt",
результат создаётся в той же папке с удалением ".crypt" в конце имени файла.
Файл добавляется путём перетаскивания на окно.
*/
#SingleInstance Force
#Persistent
#MaxMem 4095
SetBatchLines -1
Gui, +AlwaysOnTop -DPIScale
Gui, Add, Text, x10, Pin:
Gui, Add, Edit, x55 yp w220 vPIN
Gui, Add, Text, x10, File:
Gui, Add, Edit, x55 yp w220 vFile +ReadOnly
Gui, Add, Button, xs y+5 w74 gCode vEnCode, EnCode
Gui, Add, Button, x+115 w74 gCode vDeCode, DeCode
Gui, Show, , Шифрование
Return
GuiDropFiles:
If (A_EventInfo > 1)
MsgBox, 262192, Ошибка!, Можно выбрать только один файл, 1
Else
GuiControl,, File, % RegExReplace(CodeFile := A_GuiControlEvent, ".*\\(.*)", "$1")
Return
Code:
Critical
Gui, Submit, NoHide
GuiControl := A_GuiControl
SplitPath, CodeFile, , Dir, Ext, NameNoExt
Error_PIN := (RegExMatch(PIN, "i)[^0-9a-z]") || PIN = "")
Error_FileExist := (!FileExist(CodeFile) || InStr(FileExist(CodeFile), "D"))
Error_DeCodeExt := (GuiControl = "DeCode" && Ext != "crypt")
If (Error_PIN || Error_FileExist || Error_DeCodeExt)
MsgBox, 262192, Ошибка!
, % (Error_PIN ? "*** В пин коде допустимы только цифры, и символы латинского алфавита" : "")
. (Error_FileExist ? "`n`n*** Кодируемый файл несуществует" : "")
. (Error_DeCodeExt ? "`n`n*** Это не кодированный файл" : "")
Else
{
TargetFile := GuiControl = "EnCode" ? CodeFile ".crypt" : Dir "\" NameNoExt
GuiControl,, %GuiControl%, 0 `%
crypt()
GuiControl,, %GuiControl%, %GuiControl%
Gui, Show
}
Return
crypt() {
Global PIN, CodeFile, TargetFile, GuiControl
File := FileOpen(CodeFile, "r"), File.Pos := 0
Size := File.RawRead(Bin, file.length), File.Close()
VarSetCapacity(buf, Size, 0)
maxPin := StrLen(PIN), iPin := Percent := 0, StepPercent := Size // 100
Loop % Size
{
NumPut((Abs(((NumGet(Bin, A_Index - 1, "Char")) + (Asc(SubStr(PIN, (iPin := iPin = maxPin ? 1 : iPin + 1), 1)))) - 255)), buf, A_Index - 1, "Char")
If !Mod(A_Index, StepPercent)
GuiControl,, %GuiControl%, % ++Percent " `%"
}
File := FileOpen(TargetFile, "w"), File.Length := 0
File.RawWrite(buf, Size), File.Close()
}
GuiClose:
ExitApp
Что (возможно) интересно, функция кодирования без-условно одинакова для шифровки \ расшифровки.