1

Тема: AHK: Шифрование текстовых файлов

Скрипт для шифрования текстовых файлов путем подстановки символа отстоящего от шифруемого на n-значений согласно ключа. Например шифруя ключом 321, слово Привет станет Ттйежу, т.к. буква П+3=Т, р+2=т и т.д. Наверняка взламывается на раз, криптостойкость не мерял, подходит для бытовых нужд.
http://img7.imageshack.us/img7/1853/oixm.jpg

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

2

Re: AHK: Шифрование текстовых файлов

Наверное вы думали про такой вариант. Потому спрошу, в чём могут быть подводные камни, если просто использовать индексы символов из ASCII таблицы windows? То бишь, без каждо-разового парсинга более сотни символов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Шифрование текстовых файлов

Думал конечно, но где то расшифровка криво происходила, где то еще что, не помню уже, в общем вариантов 5 попробовал, в том числе и с форума. В итоге сделал свой. Остальные варианты просто надо б допилить.
Вот примеры

+ открыть спойлер

StringSplit, P, PIN
Loop, read, %FileForCript% ; считать  файл
{
Loop, Parse, A_LoopReadLine ; парсим строку
{
If A_GuiControl = Cript
{
n := Asc(A_LoopField) ; возвращает код ASCII (число от 1 до 255).
n := n + P1 - P2 + P3 ; преобразует код ASCII с помощью ключа
}
If A_GuiControl = DeCript
{
n := A_LoopField - P3 + P2 - P1
n := Chr(n) ; возвращает букву
}
Modified .= n "|"
}

+ открыть спойлер

StringSplit, P, PIN ; парсим ключ
Loop, Parse, FileForCript
{
Letter := A_LoopField
n += 1 ; увеличить счетчик
If n > %P0% ; если счетчик больше длины ключа
{
n = 1 ; присвоить значение 1
Loop, % StrLen(PIN) ; %
text .= List%A_Index%
}
L := P%n%
List%L% := Letter ; присваиваем в массив
}

4

Re: AHK: Шифрование текстовых файлов

Ок.
Ещё вопрос: может-быть в целях упрощения, при старте индексировать "Table" в массив.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Шифрование текстовых файлов

Может, но у меня старая версия AHK, там вроде массивов нет. А еще лучше б коллекцию.
Тут уж не так много символов в Table, чтобы видна была разница с массивом.

6

Re: AHK: Шифрование текстовых файлов

Zohann пишет:

А еще лучше б коллекцию.

Не понял фразу. Не могли-бы уточнить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Шифрование текстовых файлов

Коллекции, я с ними в VBA работаю, вместо массива бывает иногда удобней использовать. Не в курсе, есть ли они в AHK.

8

Re: AHK: Шифрование текстовых файлов

Интересно. Краткую суть немогли-бы описать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Шифрование текстовых файлов

В интернете полно информации. Посмотрите там, а то мы отвлеклись от темы.

10

Re: AHK: Шифрование текстовых файлов

В интернете полно информации.

Хотел подвести вас к мысли, что здесь также уместны массивы, они же - коллекции.
http://l.autohotkey.net/docs/Objects.ht … ple_Arrays
http://l.autohotkey.net/docs/Objects.ht … ive_Arrays

а то мы отвлеклись от темы

Ну если обсуждение сокращения кода, и улучшения его быстродействия, это оффтоп, то прошу прощения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Шифрование текстовых файлов

serzh82saratov пишет:

Хотел подвести вас к мысли, что здесь также уместны массивы, они же - коллекции.

А какой смысл массива здесь? Алгоритм шифрования: поиск буквы и замена ее на n-отстоящую, где n порядковый номер символа ключа.
Да и неизвестно еще, что лучше хранить, массив или одну строковую переменную. Я б конечно попробовал с массивом, но у меня AHK не поддерживает их. Если хотите - попробуйте, результат выложите.

12

Re: AHK: Шифрование текстовых файлов

Если хотите - попробуйте, результат выложите.

Ок. Найду клавиатуру, сделаю.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: serzh82saratov, 2013-06-27 19:45:42)

Re: AHK: Шифрование текстовых файлов

Алгоритм таков:


text = Ошибка! Выберите один или несколько файлов!
PIN = 369

Global Table := "а бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А    БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "1234567890"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            , Sym := {}, iSym := {}, MI

Loop, parse, Table
    Sym.Insert(A_LoopField, A_Index), iSym.Insert(A_LoopField)
MI := iSym.MaxIndex()

  ;  -----------------------------------------------------------

MsgBox % Cript := Cripting(text, PIN)
MsgBox % Cripting(Cript, PIN, 1)    ;    mode = 1 - DeCript

  ;  -----------------------------------------------------------

Cripting(text, PIN, mode := 0, C := 1) { 
    StringSplit, P, PIN
    Loop, parse, text 
        i := Sym[A_LoopField], P := P%C%, C := ++C > P0 ? 1 : C
        , iR := mode ? i - P : i + P
        , iR := iR < 1 && mode ? MI + i - P : iR > MI ? MI + P - MI : iR 
        , Res .= i = "" ? A_LoopField : iSym[iR]
    Return Res
} 

Но надо допиливать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Шифрование текстовых файлов

serzh82saratov пишет:

Алгоритм таков:

Неплохоб комментарии для наглядности привести

15

Re: AHK: Шифрование текстовых файлов

Допилить надо-бы сначала.
И, есть теперь подозрение, что неполучится

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: serzh82saratov, 2013-06-28 10:51:01)

Re: AHK: Шифрование текстовых файлов


text := "И, есть теперь подозрение, что неполучится"
PIN := 369

Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163
            
  ;  -----------------------------------------------------------

MsgBox % Cript := Cripting(text, PIN)
MsgBox % Cripting(Cript, PIN, 1)    ;    mode = 1 - DeCript

  ;  -----------------------------------------------------------

Cripting(text, PIN, mode := 0, C := 1) { 
    StringSplit, P, PIN
    Loop, parse, text  
        i := RegExMatch(Table, "\Q" A_LoopField "\E"), P := P%C%
        , C := ++C > P0 ? 1 : C, iR := mode ? i - P : i + P
        , iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) 
    Return Res
} 

Проверил, на скорость:

+ открыть спойлер

SetBatchLines -1
PIN := 3691

Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163
            
  ;  -----------------------------------------------------------
  
File = %A_Desktop%\text
FileDelete, %File%.Cript
FileDelete, %File%.DeCript

FileRead, text, %File%.txt

MsgBox % Res := Cripting(text, PIN)
FileAppend, %Res%, %File%.Cript


FileRead, text, %File%.Cript
MsgBox % Res := Cripting(text, PIN, 1)    ;    mode = 1 - DeCript
FileAppend, %Res%, %File%.DeCript


  ;  -----------------------------------------------------------

Cripting(text, PIN, mode := 0, C := 1) { 
    StringSplit, P, PIN
    Loop, parse, text
        i := RegExMatch(Table, "\Q" A_LoopField "\E"), P := P%C%
        , C := ++C > P0 ? 1 : C, iR := mode ? i - P : i + P
        , iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) 
    Return Res
} 

получилось в несколько раз быстрее.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Zohann, 2013-06-28 11:20:11)

Re: AHK: Шифрование текстовых файлов

Запустил, работает, разбираюсь. Код в разы меньше конечно, это хорошо.
Кстати из справки:

Для поиска простых подстрок используйте функцию InStr(), поскольку она быстрее, чем RegExMatch().

В строке C := ++C > P0 ? 1 : C при первом проходе С становится 2, для шифрования конечно некритично, но все же.

18

Re: AHK: Шифрование текстовых файлов

Для поиска простых подстрок используйте функцию InStr(), поскольку она быстрее, чем RegExMatch().

На таком тексте:


text = 
(
И, есть теперь подозрение, что неполучится


a%A_Space%bcdefghijklmnopqrstuvwxyz
A%A_Tab%BCDEFGHIJKLMNOPQRSTUVWXYZ

'-!"#$&()*,./:`;?@[_\]|^``{}~+<=>№`%
)

можно пример?

----------------------------------------------------------------------

В строке C := ++C > P0 ? 1 : C  при первом проходе С становится 2, для шифрования конечно некритично, но все же.

Ну и что?
Ведь в первом проходе "как и положено" используется первый символ пин кода для кодирования. Зачем вам С (индекс Р), которая будет использована только в следующей итерации?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Шифрование текстовых файлов

Например так:

вместо i := RegExMatch(Table, "\Q" A_LoopField "\E")
использовать StringGetPos, i,  Table, %A_LoopField%
i +=1

Если справка верна, то должен быть выигрыш в скорости на большом тексте.

В строке C := ++C > P0 ? 1 : C  при первом проходе С становится 2

Да, сорри, подставил в конец функции Msgbox с переменными, все правильно считает.

20 (изменено: serzh82saratov, 2013-06-29 06:12:52)

Re: AHK: Шифрование текстовых файлов

использовать StringGetPos, i,  Table, %A_LoopField%
i +=1

Ну так ведь не работает:


text = 
(
И, есть теперь подозрение, что неполучится


a%A_Space%bcdefghijklmnopqrstuvwxyz
A%A_Tab%BCDEFGHIJKLMNOPQRSTUVWXYZ

'-!"#$&()*,./:`;?@[_\]|^``{}~+<=>№`%
)


SetBatchLines -1
PIN := 3691

Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163
            
  ;  -----------------------------------------------------------
  
MsgBox % Res := Cripting(text, PIN)
MsgBox % Res := Cripting(Res, PIN, 1)    

  ;  -----------------------------------------------------------

Cripting(text, PIN, mode := 0, C := 1)     {
    StringSplit, P, PIN
    Loop, parse, text
    {
        StringGetPos, i,  Table, %A_LoopField%
        i +=1
        P := P%C%
        , C := ++C > P0 ? 1 : C, iR := mode ? i - P : i + P
        , iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1)
    }    
    Return Res
}


АП.
Если добавить - StringCaseSense, On то работает. Вообщем интересно, сравните скорости.

Если справка верна, то должен быть выигрыш в скорости на большом тексте.

выигрыш в скорости сейчас и так на глаз 15-20 кратный.

Для скорости можно сделать 2 функции, чтоб непроверять пару лишних условий в каждой итерации:

+ открыть спойлер

Cript(text, PIN, C := 1)     {
    StringSplit, P, PIN
    Loop, parse, text
        i := RegExMatch(Table, "\Q" A_LoopField "\E"), P := P%C%
        , C := ++C > P0 ? 1 : C, iR := i + P, iR := iR > MI ? i + P - MI : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1)
    Return Res
}


DeCript(text, PIN, C := 1)     {
    StringSplit, P, PIN
    Loop, parse, text 
        i := RegExMatch(Table, "\Q" A_LoopField "\E"), P := P%C%
        , C := ++C > P0 ? 1 : C, iR := i - P, iR := iR < 1 ? MI + i - P : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1)
    Return Res
}

Ещё в начале проверять i = 0 и Continue, для невыполнения ненужного.

Наверняка взламывается на раз, криптостойкость не мерял, подходит для бытовых нужд.

Для улучшения криптостойкости можно перемешать таблицу.
И например, если число пин кода чётное или заданное, то вычитать позицию при кодировании, и наоборот при расшифровке.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Шифрование текстовых файлов

С StringGetPos работает где-то на 15 % быстрее:


StringCaseSense, On
SetBatchLines -1

Cripting(text, PIN, mode := 0, C := 1)     {
    StringSplit, P, PIN
    Loop, parse, text
    {
        StringGetPos, i, Table, %A_LoopField%
        i++, P := P%C%, C := ++C > P0 ? 1 : C, iR := mode ? i - P : i + P
        , iR := iR < 1 ? MI + iR : iR > MI ? iR - MI : iR
        , Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1)
    }
    Return Res
}

1 000 000 символов за 2.2 сек против 2.6 с RegExMatch.
Причём запись как i++ и запятые в продолжение строк, дают также небольшой прирост.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Шифрование текстовых файлов

http://i47.fastpic.ru/big/2013/0630/c0/22a3c3e03aed46784862d0876a084ec0.jpg

SetKeyDelay, 20
SetTitleMatchMode, 2
AutoTrim Off
Title = Шифрование ; заголовок 
ExtList = txt,ahk,ini,bat,htm ; допустимые расширения
Global A, K
Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163            
; ----------------------------------------------------
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 Checked1, Добавить время
Gui, Add, Checkbox, xs vNoExt, Скрыть расширение
Gui, Add, Checkbox, xs vSaveNewFolder, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript v0, Cript
Gui, Add, Button, x+5 w74 gDeCript v1, 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   ; проверка расширений файлов
        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 = 0
    {
    MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
    Return
    }
If FileList =
    {
    MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
    Return
    }    
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
    {
    MsgBox, 262192, Ошибка!, Введите цифровой код!
    Return
    }
A := 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 ; изменить размерность прогрессбара    
FormatTime, Time, A_Now, HH_mm_ss
; ----------------------------------------------------
Loop, parse, FileList, `n ; чтение списка файла
    { 
    Modified = ; очистка строки 
    SplitPath, A_LoopField, , Dir, Extension, NameNoExt ; получить расширение файла    
    If SaveNewFolder = 1 ; Сохранять ли в папку
        {
        IfNotExist, Dir "\" A_GuiControl ; создать папку 
            FileCreateDir, %Dir%\%A_GuiControl%
        Dir := Dir "\" A_GuiControl ; присвоить путь
        }
    NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; добавить время   
    Name := NoExt = 0 ? NameNoExt "." Extension    : NameNoExt ; скрыть расширение   
    Loop, read, %A_LoopField% ; читаем файл
        Modified .= Cript(A_LoopReadLine, PIN, A_GuiControl, 1) "`n" ; кодируем строку
    FileAppend, %Modified%, %Dir%\%Name% ; Сохранение файла     
    }
Return
; ----------------------------------------------------
Cript(text, PIN, mode, C) { 
    StringSplit, P, PIN ; сплит ключа
    Loop, parse, text
        {
        A += 1 ; подсчет обработанных символов            
        GuiControl,, MyProgress, %A% ; изменяем прогрессбар
        GuiControl, , Cripting, % Floor(A*100/K)"%" ; % изменяем поле (округляем до ближайшего целого числа в меньшую сторону)
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ
        }
    Return Res
}
GuiClose:
ExitApp

23

Re: AHK: Шифрование текстовых файлов

InStr(Table, A_LoopField, 1)

CaseSensitive = false

Точно.
------------

iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR

на

iR := iR < 1 ? MI + iR : iR > MI ? iR - MI : iR

; присвоить замещающий символ

если он есть в таблице.
------------
Больше добавить нечего.
------------
Надо бы ещё сделать, чтоб кодировка файла неменялась. Например: Утф превращается в Анси при кодировании.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Шифрование текстовых файлов

Ещё вопрос: зачем LoopReadLine?
Почему не FileRead?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25

Re: AHK: Шифрование текстовых файлов

serzh82saratov пишет:

Ещё вопрос: зачем LoopReadLine?
Почему не FileRead?

Loop, Read вроде бы быстрее работает
С кодировкой я не сталкивался.

26

Re: AHK: Шифрование текстовых файлов

Loop, Read вроде бы быстрее работает

справка пишет:

Для загрузки целого файла в переменную используйте команду FileRead, так как она работает быстрее, чем цикл (особенно для больших файлов).

С кодировкой я не сталкивался.

Иногда это критично. Особенно для кодов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27 (изменено: Zohann, 2013-07-01 09:32:50)

Re: AHK: Шифрование текстовых файлов

Для загрузки целого файла в переменную используйте команду FileRead, так как она работает быстрее, чем цикл (особенно для больших файлов).

Справка пишет:
Loop (чтение файла)
Цикл чтения файла полезен в случаях, когда вы хотите обработать каждую строку текстового файла по очереди. Он работает быстрее, чем команда FileReadLine, потому что: 1) файл может оставаться открытым в течение всей операции; и 2) нет необходимости каждый раз снова сканировать файл в поисках строки с нужным номером.

А не займет загрузка целого файла в переменную больше времени чем чтение строк? И может Loop, read и так считывает строку из переменной, а не из файла?

28

Re: AHK: Шифрование текстовых файлов

Зачем каждую строку? Если всё равно весь файл шифровать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Шифрование текстовых файлов

Если хотите - попробуйте, результат выложите.

30

Re: AHK: Шифрование текстовых файлов

А что пробовать:

FileRead, text, %File%.ahk

MsgBox % Res := Cripting(text, PIN)
FileAppend, %Res%, %File%.Cript
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: Шифрование текстовых файлов

А что пробовать:

Результат в секундах в обоих вариантах

32

Re: AHK: Шифрование текстовых файлов

Как ни странно 2155 против 2105 с Loop, read. Думаю для лаконичности кода, и недобавления переноса последней строки можно и FileRead пользовать.

Кстати почему недобавили SetBatchLines -1? 2155 против 5565 без SetBatchLines.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Шифрование текстовых файлов

Думаю для лаконичности кода, и недобавления переноса последней строки можно и FileRead пользовать.

Согласен

Кстати почему недобавили SetBatchLines -1? 2155 против 5565 без SetBatchLines.

Да как то не думал, надо добавить, согласен.

34

Re: AHK: Шифрование текстовых файлов

Ещё есть мнение что GuiControl очень сильно тормозит процесс.


Cript(text, PIN, mode, C) { 
    StringSplit, P, PIN ; сплит ключа
    Loop, parse, text
        {
        A += 1 ; подсчет обработанных символов 
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ
        }           
        GuiControl,, MyProgress, %A% ; изменяем прогрессбар
        GuiControl, , Cripting, % Floor(A*100/K)"%" ; % изменяем поле (округляем до ближайшего целого числа в меньшую сторону)
    Return Res
}

или на каждом сотом символе его применять.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: Шифрование текстовых файлов

Ещё есть мнение что GuiControl очень сильно тормозит процесс.

Каждая строчка кода тормозит процесс, давайте оставим прогрессбар как есть

36

Re: AHK: Шифрование текстовых файлов

Замена считывания строк на чтение файла
Очистка списка файлов после де/шифрования
Создание папки выведено из цикла чтения файлов
PIN как глобальная переменная
Добавлено SetBatchLines -1
Исправлен подсчет кол-ва символов в файлах

SetBatchLines -1
ExtList = txt,ahk,ini,bat,htm ; допустимые расширения
Global A, K, PIN
Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163            
; ----------------------------------------------------
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 Checked1, Добавить время
Gui, Add, Checkbox, xs vNoExt, Скрыть расширение
Gui, Add, Checkbox, xs vSaveNewFolder, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript v0, Cript
Gui, Add, Button, x+5 w74 gDeCript v1, DeCript
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, w160, Шифрование
Return
; ----------------------------------------------------
GuiDropFiles:
If A_GuiControl <> Cripting ; проверка контрола
    Return
nFiles = 
FileList = 
Loop, parse, A_GuiControlEvent, `n
    {
    SplitPath, A_LoopField, FileName, Dir, Extension, NameNoExt ; получить данные пути файла
    nFiles += 1 ; подсчет количества файлов
    If Extension   ; проверка расширений файлов
        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 = 0
    {
    MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
    Return
    }
If FileList =
    {
    MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
    Return
    }    
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
    {
    MsgBox, 262192, Ошибка!, Введите цифровой код!
    Return
    }
A := K := 0
Loop, parse, FileList, `n  ; подсчет количества символов в файлах
    {
    FileRead, Text, %A_LoopField%
    K += StrLen(Text)
    }
Range = 0-%K%
GuiControl, +Range%Range%, MyProgress ; изменить размерность прогрессбара    
If SaveNewFolder = 1 ; сохранять ли в папку
    {
    IfNotExist, Dir "\" A_GuiControl ; проверка папки
        FileCreateDir, %Dir%\%A_GuiControl% ; создать папку 
    Dir := Dir "\" A_GuiControl ; присвоить путь
    }
FormatTime, Time, A_Now, HH_mm_ss
; ----------------------------------------------------
Loop, parse, FileList, `n ; чтение списка файла
    { 
    Modified = ; очистка строки 
    SplitPath, A_LoopField, , , Extension, NameNoExt ; получить расширение файла
    NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; добавить время   
    Name := NoExt = 0 ? NameNoExt "." Extension    : NameNoExt ; скрыть расширение   
       FileRead, text, %A_LoopField%
    Modified := Cript(text, A_GuiControl, 1)
    FileAppend, % Modified, % Dir "\" Name ; Сохранение файла  
    }
FileList = ; очистка списка файлов
Return
; ----------------------------------------------------
Cript(text, mode, C) { 
    StringSplit, P, PIN ; сплит ключа
    Loop, parse, text
        {
        A += 1 ; подсчет обработанных символов            
        GuiControl,, MyProgress, %A% ; изменяем прогрессбар
        GuiControl, , Cripting, % Floor(A*100/K)"%" ; % изменяем поле (округляем до ближайшего целого числа в меньшую сторону)
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ
        }
    Return Res
}
GuiClose:
ExitApp

37

Re: AHK: Шифрование текстовых файлов

Думаю получился отличный скрипт для шифрования, и многие могут теперь им воспользоватся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38

Re: AHK: Шифрование текстовых файлов

А тут разве не посерьезнее будет?
http://forum.script-coding.com/viewtopi … 769#p69769

39

Re: AHK: Шифрование текстовых файлов

Malcev
Вы понимаете. Александр_, он чертовски талантлив.
А нам надо мыслить в силу своих знаний...
Мужчина - программист.
А мы с вами - дилетанты.
Вы возьмётесь объяснить его алгоритм?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

40

Re: AHK: Шифрование текстовых файлов

Malcev пишет:

А тут разве не посерьезнее будет?

Мы ж тут не письками меряемся. А делимся знаниями, чтобы их и прирастало.

41 (изменено: serzh82saratov, 2013-07-12 09:31:44)

Re: AHK: Шифрование текстовых файлов

serzh82saratov пишет:

Ещё есть мнение что GuiControl очень сильно тормозит процесс.

И всё таки очень сильно. Этот вариант работает минимум в 10 раз быстрее без ущерба для наглядности прогресса:


SetBatchLines -1
ExtList = txt,ahk,ini,bat,htm ; допустимые расширения
Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163, PIN, R
; ----------------------------------------------------
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 Checked1, Добавить время
Gui, Add, Checkbox, xs vNoExt, Скрыть расширение
Gui, Add, Checkbox, xs vSaveNewFolder, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript v0, Cript
Gui, Add, Button, x+5 w74 gDeCript v1, DeCript
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, w160, Шифрование
Return
; ----------------------------------------------------
GuiDropFiles:
If A_GuiControl <> Cripting ; проверка контрола
    Return
nFiles = 
FileList = 
Loop, parse, A_GuiControlEvent, `n
    {
    SplitPath, A_LoopField, FileName, Dir, Extension, NameNoExt ; получить данные пути файла
    nFiles += 1 ; подсчет количества файлов
    If Extension   ; проверка расширений файлов
        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 = 0
    {
    MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
    Return
    }
If FileList =
    {
    MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
    Return
    }    
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
    {
    MsgBox, 262192, Ошибка!, Введите цифровой код!
    Return
    }
K := 0
Loop, parse, FileList, `n  ; подсчет количества символов в файлах
    {
    FileRead, Text, %A_LoopField%
    K += StrLen(Text)
    }
R := K // 100
If SaveNewFolder = 1 ; сохранять ли в папку
    {
    IfNotExist, Dir "\" A_GuiControl ; проверка папки
        FileCreateDir, %Dir%\%A_GuiControl% ; создать папку 
    Dir := Dir "\" A_GuiControl ; присвоить путь
    }
FormatTime, Time, A_Now, HH_mm_ss
; ----------------------------------------------------
Loop, parse, FileList, `n ; чтение списка файла
    { 
    Modified = ; очистка строки 
    SplitPath, A_LoopField, , , Extension, NameNoExt ; получить расширение файла
    NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; добавить время   
    Name := NoExt = 0 ? NameNoExt "." Extension    : NameNoExt ; скрыть расширение   
    FileRead, text, %A_LoopField% 
    FileAppend, % Cript(text, A_GuiControl), % Dir "\" Name ; Сохранение файла  
    }
FileList = ; очистка списка файлов
Return
; ----------------------------------------------------
Cript(text, mode) { 
    C := A := 1
    StringSplit, P, PIN ; сплит ключа 
    Loop, parse, text
        {
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + iR : iR > MI ? iR - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ  
        If !Mod(A_Index, R)
            {
            GuiControl,, Cripting, % A++ "%"    ; % изменяем поле  
            GuiControl,, MyProgress, %A%    ; изменяем прогрессбар
            }
        }  
    GuiControl,, Cripting, 100`% 
    Return Res
}

Если считать что Range1-100 это вполне достаточно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

42

Re: AHK: Шифрование текстовых файлов

И всё таки очень сильно.

Ну кто ж спорит. Кстати я его (прогрессбар) первый раз сделал, просто давно хотел попробовать. Провести расчет и кол-во данных, и чтобы точнехонько на 100% заканчивался. Вроде получилось. Так что можно оставить его как пример.
Кстати Ваш прогрессбар криво у меня работает.

43 (изменено: serzh82saratov, 2013-07-12 15:55:07)

Re: AHK: Шифрование текстовых файлов

Тут нужно как можно меньше взаимодействовать с GUI Миллион символов и миллион раз дёргать гуи не айс.

Кстати я его (прогрессбар) первый раз сделал, просто давно хотел попробовать.

Может будет стимулом для переделки моего варианта.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

44

Re: AHK: Шифрование текстовых файлов

+ Отключение визуализации прогресса (для более быстрого де/шифрования)
+ Показ итогового времени выполнения

SetBatchLines -1
ExtList = txt,ahk,ini,bat,htm ; допустимые расширения
Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%"
            . "1234567890", MI := 163, A, K, PIN, Visyal           
; ----------------------------------------------------
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 vVisyal Checked1, Визуализация
Gui, Add, Checkbox, xs vAddTime Checked1, Добавить время
Gui, Add, Checkbox, xs vNoExt, Скрыть расширение
Gui, Add, Checkbox, xs vSaveNewFolder, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript v0, Cript
Gui, Add, Button, x+5 w74 gDeCript v1, DeCript
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, w160, Шифрование
Return
; ----------------------------------------------------
GuiDropFiles:
If A_GuiControl <> Cripting ; проверка контрола
    Return
nFiles = 
FileList = 
Loop, parse, A_GuiControlEvent, `n
    {
    SplitPath, A_LoopField, FileName, Dir, Extension, NameNoExt ; получить данные пути файла
    nFiles += 1 ; подсчет количества файлов
    If Extension   ; проверка расширений файлов
        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 = 0
    {
    MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
    Return
    }
If FileList =
    {
    MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
    Return
    }    
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
    {
    MsgBox, 262192, Ошибка!, Введите цифровой код!
    Return
    }
StartTime := A_TickCount
A := K := 0
Loop, parse, FileList, `n  ; подсчет количества символов в файлах
    {
    FileRead, Text, %A_LoopField%
    K += StrLen(Text)
    }
Range = 0-%K%
GuiControl, +Range%Range%, MyProgress ; изменить размерность прогрессбара    
If SaveNewFolder = 1 ; сохранять ли в папку
    {
    IfNotExist, Dir "\" A_GuiControl ; проверка папки
        FileCreateDir, %Dir%\%A_GuiControl% ; создать папку 
    Dir := Dir "\" A_GuiControl ; присвоить путь
    }
FormatTime, Time, A_Now, HH_mm_ss
; ----------------------------------------------------
Loop, parse, FileList, `n ; чтение списка файла
    { 
    Modified = ; очистка строки 
    SplitPath, A_LoopField, , , Extension, NameNoExt ; получить расширение файла
    NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; добавить время   
    Name := NoExt = 0 ? NameNoExt "." Extension    : NameNoExt ; скрыть расширение   
       FileRead, text, %A_LoopField%
    FileAppend, % Cript(text, A_GuiControl), % Dir "\" Name ; Сохранение файла 
    }
FileList = ; очистка списка файлов
; ----------------------------------------------------    
tm1 := (A_TickCount - StartTime)/1000
tm2 := Floor(tm1)
StringMid, ms, tm1, StrLen(tm2) + 2, 3
GuiControl, , Cripting, % "Выполнено за " FormatSeconds(Tm2) "'" ms
Return
; ----------------------------------------------------
Cript(text, mode) { 
    C := 1
    StringSplit, P, PIN ; сплит ключа
    Loop, parse, text
        {
        If Visyal 
            {
            GuiControl,, MyProgress, % A++ ; изменяем прогрессбар
            GuiControl, , Cripting, % Floor(A*100/K)"%" ; % изменяем поле (округляем до ближайшего целого числа в меньшую сторону)
            }
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + i - P : iR > MI ? i + P - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ
        }
    Return Res
}
; ----------------------------------------------------
FormatSeconds(NumberOfSeconds)
    {
    time = 19990101  ; Полночь произвольной даты.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss
    }
GuiClose:
ExitApp

45

Re: AHK: Шифрование текстовых файлов

Кстати Ваш прогрессбар криво у меня работает.

Проверьте на этом:


SetBatchLines -1
ExtList = txt,ahk,ini,bat,htm ; допустимые расширения
Global Table := "а" A_Space "бвгдеёжзийклмнопрстуфхцчшщъыьэюя"
            . "А" A_Tab "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "'-!""#$&()*,./:`;?@[_\]|^``{}~+<=>№`%`r`n"
            . "1234567890", MI := 163, PIN, R
; ----------------------------------------------------
Gui, Add, Edit, x5 w150 vPIN Number, 3345
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 Checked1, Добавить время
Gui, Add, Checkbox, xs vNoExt, Скрыть расширение
Gui, Add, Checkbox, xs vSaveNewFolder, Сохранять в новую папку
Gui, Add, Button, xs y+5 w74 gCript v0, Cript
Gui, Add, Button, x+5 w74 gDeCript v1, DeCript
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, w160, Шифрование
Return
; ----------------------------------------------------
GuiDropFiles:
If A_GuiControl <> Cripting ; проверка контрола
    Return
nFiles := FileList := "" 
Loop, parse, A_GuiControlEvent, `n
    {
    SplitPath, A_LoopField, FileName, Dir, Extension, NameNoExt ; получить данные пути файла
    nFiles += 1 ; подсчет количества файлов
    If Extension   ; проверка расширений файлов
        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 = 0
    {
    MsgBox, 262192, Ошибка!, Выберите минимум один вариант имён файлов`nили сохранение в папку %FolderToSave%!
    Return
    }
If FileList =
    {
    MsgBox, 262192, Ошибка!, Выберите один или несколько файлов!
    Return
    }    
if RegExMatch(PIN, ".*\D.*") = 1 ; проверка введенного кода
    {
    MsgBox, 262192, Ошибка!, Введите цифровой код!
    Return
    }
K := 0
Loop, parse, FileList, `n  ; подсчет количества символов в файлах
    {
    FileRead, Text, %A_LoopField%
    K += StrLen(Text)
    }
R := K // 99
If SaveNewFolder = 1 ; сохранять ли в папку
    {
    IfNotExist, Dir "\" A_GuiControl ; проверка папки
        FileCreateDir, %Dir%\%A_GuiControl% ; создать папку 
    Dir := Dir "\" A_GuiControl ; присвоить путь
    }
FormatTime, Time, A_Now, HH_mm_ss
; ----------------------------------------------------
Loop, parse, FileList, `n ; чтение списка файла
    { 
    Modified = ; очистка строки 
    SplitPath, A_LoopField, , , Extension, NameNoExt ; получить расширение файла
    NameNoExt := AddTime = 1 ? Time "_" NameNoExt : NameNoExt ; добавить время   
    Name := NoExt = 0 ? NameNoExt "." Extension    : NameNoExt ; скрыть расширение   
    FileRead, text, %A_LoopField% 
    FileAppend, % Cript(text, A_GuiControl), % Dir "\" Name ; Сохранение файла  
    }
FileList = ; очистка списка файлов
Return
; ----------------------------------------------------
Cript(text, mode) { 
    C := A := 1
    StringSplit, P, PIN ; сплит ключа 
    Loop, parse, text
        {
        i := InStr(Table, A_LoopField, 1) ; поиск позиции символа в Table
        P := P%C% ; очередной символ ключа
        C := ++C > P0 ? 1 : C ; проверка длины ключа
        iR := mode ? i - P : i + P ; шифруем или дешифруем
        iR := iR < 1 ? MI + iR : iR > MI ? iR - MI : iR ; позиция замещающего символа
        Res .= i = 0 ? A_LoopField : SubStr(Table, iR, 1) ; присвоить замещающий символ  
        If !Mod(A_Index, R)
            {
            GuiControl,, MyProgress, %A%    ; изменяем прогрессбар
            GuiControl,, Cripting, % A++ "%"    ; % изменяем поле  
            }
        }  
    GuiControl,, Cripting, 100`% 
    GuiControl,, MyProgress, 100
    Return Res
}

В таблицу добавил переводы строк.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui