1 (изменено: Strongest, 2013-08-02 03:26:22)

Тема: AHK: Чтение\запись файла по битам\байтам. (криптография)

Опишу ситуацию: Есть криптографическая программа, написанная на C++ (писал очень давно), программа применяет совершенно не стандартный (авторский), алгоритм шифрования текста, применяется небольшой группой людей на протяжении нескольких лет (завоевала доверие).
Принцип работы программы: Генерируя либо используя готовый ключ, шифрует текст из стандартного набора символов.

Общая задача: С помощью AHK скрипта считывать любой файл по байтам, записывать шестнадцатеричный код в текстовый файл (AA FF CC 4C), шифровать программой как текст, и в обратную сторону.

Задача AHK скрипта: Считывать любой файл по битам\байтам, записывать в текстовом виде шестнадцатеричный код в файл, и обратный алгоритм.

Реально ли это сделать по средствам AHK?

2

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

В общих чертах так:

SetBatchLines, -1
SourseFile := A_Desktop "\test.txt"   ; указать пути к файлам
HexDataFile := A_Desktop "\hex.txt"
TargetFile := A_Desktop "\target.txt"
return

!1::
   GetHexData(SourseFile, HexDataFile)
   MsgBox, Готово!
   return
   
!2::
   WriteFileFromHexData(HexDataFile, TargetFile)
   MsgBox, Готово!
   ExitApp

GetHexData(SourseFile, HexDataFile)
{
   File := FileOpen(SourseFile, "r")
   FileSize := File.Length

   VarSetCapacity(buf, FileSize)
   File.RawRead(buf, FileSize)
   File.Close()

   SetFormat, IntegerFast, H
   Loop % FileSize
      Text .= (A_Index = 1 ? "" : " ") . SubStr("0" . SubStr(NumGet(buf, A_Index - 1, "UChar"), 3), -1)

   FileDelete, % HexDataFile
   FileAppend, % Text, % HexDataFile
}

WriteFileFromHexData(HexDataFile, TargetFile)
{
   FileRead, Text, % HexDataFile

   VarSetCapacity(buf, FileSize := (StrLen(RegExReplace(Text, "\s"))/2))

   Loop, parse, Text, % " "
   {
      Number := "0x" . A_LoopField
      NumPut(Number, buf, A_Index - 1, "UChar")
   }

   File := FileOpen(TargetFile, "w")
   File.RawWrite(buf, FileSize)
   File.Close()
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Спасибо огромное.
Вот за что я и влюбился в AHK, все интуитивно просто!
Было бы побольше русского материла для изучения, по встроенным функциям практически совсем нет информации…

4

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Здесь Вы можете перевести нужный раздел документации и выложить плоды своих трудов.

5

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

В коде ошибка. Нужно заменить все Char на UChar, отредактировал. С текстовыми файлами работает и так, а с другими некорректно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

А вообще-то тоже не совсем корректно работает, не читает по какой-то причине BOM в начале файла. Вот так работает с любыми файлами:

SetBatchLines, -1
SourseFile := A_Desktop "\test.txt"   ; указать пути к файлам
HexDataFile := A_Desktop "\hex.txt"
TargetFile := A_Desktop "\target.txt"
return

!1::
   GetHexData(SourseFile, HexDataFile)
   MsgBox, Готово!
   return
   
!2::
   WriteFileFromHexData(HexDataFile, TargetFile)
   MsgBox, Готово!
   ExitApp

GetHexData(SourseFile, HexDataFile)
{
   BinaryStream := ComObjCreate("ADODB.Stream")
   BinaryStream.Type := 1 ; adTypeBinary
   BinaryStream.Open
   BinaryStream.LoadFromFile(SourseFile)
   BinaryArray := BinaryStream.Read
   BinaryStream.Close

   SetFormat, IntegerFast, H
   Loop % BinaryArray.MaxIndex() + 1
      Text .= (A_Index = 1 ? "" : " ") . SubStr("0" . SubStr(BinaryArray[A_Index-1]+0, 3), -1)
   
   File := FileOpen(HexDataFile, "w")
   File.Write(Text)
   File.Close()
}

WriteFileFromHexData(HexDataFile, TargetFile)
{
   FileRead, Text, % HexDataFile

   VarSetCapacity(buf, FileSize := StrLen(RegExReplace(Text, "\s"))/2)
   Loop, parse, Text, % " "
      NumPut("0x" . A_LoopField, buf, A_Index - 1, "UChar")

   File := FileOpen(TargetFile, "w")
   File.RawWrite(buf, FileSize)
   File.Close()
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Тоже почему то не получается, новый код создает Target файл, но не чего в него не пишет ("Hex" есть).

8

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

У меня всё работает. Пришли файл, который не копируется. Или вообще не получается? Проверь, правильно ли код записан, и правильно ли указаны пути к файлам.

У кого-нибудь ещё не работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Скобка не там стоит (предпоследняя). Должно быть так:

VarSetCapacity(buf, FileSize := StrLen(RegExReplace(Text, "\s"))/2)

10

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Ага, точно, это я удалял лишние скобки, не проверив. Отредактировал. А почему File.RawRead не читает BOM нет мыслей? Баг?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Хм, действительно, не читает. Судя по справке, не баг, а фича:

When a file containing a UTF-8 or UTF-16 byte order mark (BOM) is opened with read access, the BOM is excluded from the output by positioning the file pointer after it. Therefore, File.Position may report 3 or 2 immediately after opening the file.

Т.е. нужен сдвиг на начало:


File.Pos := 0

12

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Вот чёрт, иногда полезно бывает справку прочитать!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Спасибо вам огромное! Теперь моя программа расширила свой спектр до бесконечности!
Пока пусть работает так, будет время, разберусь как это сделать в “C++” для еще большей мобильности!

14 (изменено: serzh82saratov, 2013-10-28 11:49:06)

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Надо было закодировать файл, написал такой скрипт:


/*
В пин коде допустимы цифры, и регистрозависимые буквы латинского алфавита.
Длинна пин кода может быть любой длинны.
Если файл кодируется, то файл-шифр создаётся в той же папке с добавлением ".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 

Что (возможно) интересно, функция кодирования без-условно одинакова для шифровки \ расшифровки.

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

15

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

NumGet(Bin, A_Index - 1, "cp1251")

Кодировка числа? Это как так?

16 (изменено: serzh82saratov, 2013-10-28 11:55:59)

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Да и не помню как туда попало
Странно почему работало, поменял на Char.

Кстати почему именно Char? Подбирал методом перебора.

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

17

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Char: An 8-bit integer, whose range is -128 (-0x80) to 127 (0x7F). An unsigned character (UChar) can be used with functions that expect a BYTE.

Формально подходя, более верно использовать тип UChar, хотя и так в данном случае ошибки не будет - Numget получает размер  операнда (1 байт), знаковое оно или нет, неважно.

18 (изменено: serzh82saratov, 2013-10-28 13:02:11)

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

А вот с UChar неработает.

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

19

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Значит, все дело в логике работы выражения в целом. Байт 0xFF в виде UChar будет 255, а в виде Char -1. Abs от этого будет получаться разный.

20 (изменено: serzh82saratov, 2013-10-28 14:21:22)

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Интересно, теперь сам непонимаю своё выражение. В Char только 128 вариантов. Например 255 и 1 с учётом Abs будут равны.

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

21

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Irbis спасибо за совет, разобрался, поправил на видимо правильный вариант с UChar:



  ;  http://forum.script-coding.com/viewtopic.php?pid=76555#p76555

/*
В пин коде допустимы цифры, и регистрозависимые буквы латинского алфавита.
Длинна пин кода может быть любой длинны.
Если файл кодируется, то файл-шифр создаётся в той же папке с добавлением ".crypt"
к имени файла. Файл-шифр всегда бинарный. Кодировать можно любые типы файлов,
 с сохранением кодировки.
Если файл декодируется, то файл-шифр должен иметь расширение "crypt",
результат создаётся в той же папке с удалением ".crypt" в конце имени файла.
Файл добавляется путём перетаскивания на окно.
*/
#SingleInstance Force
#Persistent 
#MaxMem 4095  
SetBatchLines -1 
   
Gui, +AlwaysOnTop -DPIScale 
Gui, Add, Text, x10, Pin:
Gui, Add, Edit, x55 yp w220 r1 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, "UChar") - 255) + Asc(SubStr(PIN, (iPin := iPin = maxPin ? 1 : iPin + 1), 1)), buf, A_Index - 1, "UChar")         
        If !Mod(A_Index, StepPercent)
            GuiControl,, %GuiControl%, % ++Percent " `%"   
    }
    File := FileOpen(TargetFile, "w"), File.Length := 0
    File.RawWrite(buf, Size), File.Close()  
}     
   
GuiClose: 
    ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

сам непонимаю своё выражение

(Error_FileExist ? "`n`n*** Кодируемый файл несуществует" : "")

Скажите, вы сознательно пишете "не" с глаголами слитно? Зачем?

23

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

К сожалению сознательно. Зачем незнаю, видимо неграмотный.

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

24

Re: AHK: Чтение\запись файла по битам\байтам. (криптография)

Не понял логики. Неграмотный не осознаёт своих ошибок.