Тема: AHK: Шифрование текстовых файлов
Скрипт для шифрования текстовых файлов путем подстановки символа отстоящего от шифруемого на n-значений согласно ключа. Например шифруя ключом 321, слово Привет станет Ттйежу, т.к. буква П+3=Т, р+2=т и т.д. Наверняка взламывается на раз, криптостойкость не мерял, подходит для бытовых нужд.
SetKeyDelay, 20
SetTitleMatchMode, 2
AutoTrim Off
Title = Шифрование ; заголовок
ExtList = txt,ahk,ini,bat ; допустимые расширения
; ----------------------------------------------------
Table1 = а бвгдеёжзийклмнопрстуфхцчшщъыьэюя ; русские строковые с пробелом
Table2 = А БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ; русские прописные с TAB
Table3 = abcdefghijklmnopqrstuvwxyz ; английские строковые
Table4 = ABCDEFGHIJKLMNOPQRSTUVWXYZ ; английские прописные
Table5 = 1234567890 ; цифры
Table6 = '-!"#$&()*,./:;?@[_\]|^``{}~+<=>№ ; знаки
Table .= Table1 Table2 Table3 Table4 Table5 Table6 "%"
; ----------------------------------------------------
Gui, Add, Edit, x5 w150 vPIN Number, Введите цифровой код
Gui, Add, Edit, xs y+5 wp R1 vCripting ReadOnly, Перетащите сюда файлы...
Gui, Add, Progress, xs y+5 wp h8 Range1-100 vMyProgress
Gui, Add, Checkbox, xs vAddTime, Добавить время
Gui, Add, Checkbox, xs vAddButton, Добавить имя кнопки
Gui, Add, Checkbox, xs vSaveNewFolder Checked1, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript, Cript
Gui, Add, Button, x+5 w74 gDeCript, DeCript
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, w160, %Title%
Return
; ----------------------------------------------------
GuiDropFiles:
If A_GuiControl <> Cripting ; проверка контрола
Return
nFiles =
FileList =
Loop, parse, A_GuiControlEvent, `n
{
SplitPath, A_LoopField, FileName, , Extension, NameNoExt ; получить расширение файла
nFiles += 1 ; подсчет количества файлов
If Extension not in %ExtList% ; проверка расширений файлов
{
MsgBox, 262192, Ошибка!, Только %ExtList%!
Return
}
}
FileList := A_GuiControlEvent ; сохранить список файлов
GuiControl,, MyProgress
GuiControl,, %A_GuiControl%, % nFiles = 1 ? FileName : "Выбрано файлов: " nFiles ; %
Return
; ----------------------------------------------------
Cript:
DeCript:
Gui, Submit, NoHide
If SaveNewFolder + AddTime + AddButton = 0
{
MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
Return
}
If FileList =
{
MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
Return
}
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
{
MsgBox, 262192, Ошибка!, Введите цифровой код!
Return
}
A = 0
K = 0
Loop, parse, FileList, `n ; подсчет количества символов в файлах
{
FileRead, Text, %A_LoopField%
StringReplace, Text, Text, `r`n, , All
K += StrLen(Text)
}
Range = 0-%K%
GuiControl, +Range%Range%, MyProgress ; изменить размерность прогрессбара
StringSplit, P, PIN ; парсим ключ посимвольно
LenT := StrLen(Table)
FormatTime, Time, A_Now, HH_mm_ss
Loop, parse, FileList, `n
{
Cripting := A_LoopField
SplitPath, Cripting, , Dir, Extension, NameNoExt ; расширение файла
If SaveNewFolder = 1 ; Сохранять в папку
{
IfNotExist, Dir "\" A_GuiControl
FileCreateDir, %Dir%\%A_GuiControl%
Dir := Dir "\" A_GuiControl
}
NameNoExt := AddButton = 1 ? A_GuiControl "_" NameNoExt : NameNoExt ; Добавить имя кнопки
NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; Добавить время
Loop, read, %Cripting% ; читаем файл
{
n = 0
Modified =
Loop, Parse, A_LoopReadLine ; парсим строку
{
Letter := A_LoopField ; присваиваем символ
Loop, Parse, Table ; парсим таблицу
{
If (A_LoopField == Letter) ; если символ нашелся (с учетом регистра)...
{
A += 1 ; подсчет обработанных символов
GuiControl,, MyProgress, %A% ; изменяем прогрессбар
GuiControl, , Cripting, % Floor(A*100/K)"%" ; % изменяем поле (округляем до ближайшего целого числа в меньшую сторону)
n += 1 ; увеличить счетчик ключа
n := n > P0 ? 1 : n ; если счетчик больше длины ключа то присвоить значение 1
If A_GuiControl = Cript ; если шифруем...
{
PosNext := A_Index + P%n% ; присвоить позицию символа для замены (текущая позиция + значение ключа)
PosNext := PosNext > LenT ? PosNext - LenT : PosNext ; если позиция больше длины таблицы то изменяем позицию
}
If A_GuiControl = DeCript ; если дешифруем...
{
PosNext := A_Index - P%n% ; присвоить позицию символа для замены (текущая позиция - значение ключа)
PosNext := PosNext < 1 ? LenT + PosNext : PosNext ; если позиция меньше единицы то изменяем позицию
}
Loop, Parse, Table ; парсим таблицу снова
{
If A_Index = %PosNext% ; если цикл дошел до искомой позиции
{
LetterNext := A_LoopField ; присваиваем символ
Break ; выходим из цикла
}
}
Modified .= LetterNext ; дополняем строку очередным символом
Break ; выходим из цикла
}
}
}
FileAppend, %Modified%`n, %Dir%\%NameNoExt%.%Extension% ; Сохранение файла
}
}
GuiControl, , Cripting, %A% из %K% символа обработано
FileList = ; очистка списка файлов
Return
GuiClose:
ExitApp

