Что нового

Шифрование данных используя StringRegExp и несколько массивов

beliy

Продвинутый
Сообщения
372
Репутация
72
Версия AutoIt: последняя

Описание: есть необходимость реализовать алгоритм шифрования смысл которого заключается в следующем:
Есть 2 переменных, $var1 и $var2 есть 3 массива которые состроят из русского и англ. алфавита верхнего и нижнего регистров, примерно такого вида:

array1:
Код:
А = Б
Б = В
В = Г
;...
a = b
b = с
с = d

array2:
Код:
А = 1
Б = 2
В = 3
;...
a = 3
b = 2
с = 1

array3:
Код:
А = Я
Б = Ю
В = Щ
;...
a = z
b = y
с = x

имеем динамические var1 и var2
Далее с помощью наших массивов и StringRegExp (можно и другим способом, если он будет более рациональным) нужно получить результат вида
Код:
var3=[1символ из var1 замененный на символ который заменяется значением из 1 массива][3символ из var2 из 2 массива] и т.д
(хочется иметь возможность манипулировать при потребности порядком и массивами)
Примечания:
Поскольку количество символов для var1 и var2 может быть разным, то думаю за базу взять 3 первых символа каждой переменной и в случае нехватки символов добавлять 0 и в случае избытка обработать 1 массивом и добавить в конец через разделитель.
Подобная реализация для меня пока сложновата, поэтому обращаюсь за помощью...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
да алгоритм шифрования вроде понятен, реализация видится похожей на скрипты транслита - http://autoit-script.ru/index.php?topic=4035.0
Хранить массив удобнее всего в теле скрипта.
совершенно непонятно почему после первого символа сразу идёт третий
в этом и заключается смысл шифрования
и как Вы собираетесь расшифровывать данные, зашифрованные с помощью массива 2.
расшифровка будет аналогично шифрованию (проблем не должно быть)
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Ну давай я еще по другому попробую объяснить? Ну, допустим, есть, 2 переменные - 123 и 456. После мы групируем по заранее придуманному алгоритму(фиксировано, аля [1 символ из первой переменной] [ 3 символ из 1 переменной] [2 символ из 2 переменной] и т.д. ) и получилось допустим 135246. Далее имеем 3 таблицы (массивы), беря данные из которых меняем символы допустим 1 и 4 (по порядку) символ меняется по 1 массиву, 2 и 5 по 2 массиву, 3 и 6 по 3 массиву. Вот значительно упростил пример. Помогите хотя бы на примере этого...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Я присоединюсь к мнению, что постановка задачи чересчур витиевата. Лучше если на словах объяснить, какие трансформации надо сделать. Прежде чем это сделать, я постараюсь дать краткую информацию, даже если это известно вопрошающему, на всякий случай и указать на явные недочеты существующего ТЗ.

Шифрование - это перевод одного набора данных (скажем А) в другой (скажем B) с применением некоего алгоритма и, возможно, с использованием дополнительных наборов данных (скажем С, D, E, etc.). При этом А наз-ся исходник или исходный текст, Б - шифр или шифротекст, C, D,E, etc - ключи. Отсюда первый вопрос - у тебя есть var1, var2 и var3. Что из этого исходник, что шифротекст и что ключи? Идем дальше. Ты говоришь, что у тебя есть array1, array2, array3. Только это не массивы. А набор строк. Т.к это форум по языку AutoIt, а у языка AutoIt есть четкий механизм работы с массивами, было бы неплохо привести свои массивы в подобающий вид. Если ты знаком с другими языками, наподобие python, perl, php, где есть ассоциативные массивы, то я тебя огорчу - в AutoIt такого нет. Поэтому, если уж массив, то только такой
Код:
$array1[$i][$j] = $some_element

Дальше. Теперь сам алгоритм.
Код:
var3=[1символ из var1 замененный на символ который заменяется значением из 1 массива][3символ из var2 из 2 массива] и т.д
Ты тут пишешь "и т.д.", которая в русской речи (да и в любой другой, наверное) подразумевает некую закономерность, которую человек может без труда восстановить глядя на имеющийся текст. В математике это наз-ся индукция. Так вот, глядя на твое объяснение алгоритма я не могу это сделать с полной уверенность. Почему после 1символ из var1 замененный на символ который заменяется значением из 1 массива следует 3символ из var2 из 2 массива, а не, скажем, 2ой?
Поэтому, beliy, если сможешь разъяснить путаницу выше, то сама задача, уверен, не такая сложная.

C2H5OH
Так как этот раздел наз-ся Стол заказов, я попрошу тебя ограничить себя ответом по существу и максимально самодостаточно для автора, без общих рекомендаций, если таковой ответ, конечно же, имеется.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Для примера взятого ТС.
Код:
#include <array.au3>

DIM $array1[256]
DIM $array2[256]
DIM $array3[256]

For $i=0 to 255
	$array1[$i] = $i
	$array2[$i] = $i
	$array3[$i] = $i
Next

$array1[Asc("0")] = Asc("1")
$array1[Asc("1")] = Asc("2")
$array1[Asc("2")] = Asc("3")
$array1[Asc("3")] = Asc("4")
$array1[Asc("4")] = Asc("5")
$array1[Asc("5")] = Asc("6")
$array1[Asc("6")] = Asc("7")
$array1[Asc("7")] = Asc("8")
$array1[Asc("8")] = Asc("9")
$array1[Asc("9")] = Asc("0")

$array2[Asc("0")] = Asc("9")
$array2[Asc("1")] = Asc("0")
$array2[Asc("2")] = Asc("1")
$array2[Asc("3")] = Asc("2")
$array2[Asc("4")] = Asc("3")
$array2[Asc("5")] = Asc("4")
$array2[Asc("6")] = Asc("5")
$array2[Asc("7")] = Asc("6")
$array2[Asc("8")] = Asc("7")
$array2[Asc("9")] = Asc("8")

$array3[Asc("0")] = Asc("9")
$array3[Asc("1")] = Asc("8")
$array3[Asc("2")] = Asc("7")
$array3[Asc("3")] = Asc("6")
$array3[Asc("4")] = Asc("5")
$array3[Asc("5")] = Asc("4")
$array3[Asc("6")] = Asc("3")
$array3[Asc("7")] = Asc("2")
$array3[Asc("8")] = Asc("1")
$array3[Asc("9")] = Asc("0")

$var1 = "123"
$var2 = "456"

$L = StringLen($var1)+StringLen($var2)

GLOBAL $combo_array = coctail( $var1, $var2 )

$eshe_parochku = nalivay()

MsgBox(0, "зашифрованный результат", $eshe_parochku)


Func coctail($string1, $string2)
	; здесь Белый что-то перемешивает и т.д.
	Return StringToASCIIArray( $string1 & $String2 )  ; а я просто склеиваю строки
EndFunc

Func nalivay()
	$result = ""
	For $i = 1 To $L
		Switch Mod($i,3)
			Case 1
				$result = $result & Chr($array1[$combo_array[$i-1]])
			Case 2
				$result = $result & Chr($array2[$combo_array[$i-1]])
			Case 0
				$result = $result & Chr($array3[$combo_array[$i-1]])
		EndSwitch
	Next
	Return $result
EndFunc


:whistle:
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
вот то что я имел введу - думаю так будет понятнее, правда код немного грубоват

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

$name = ''
$fam = ''
$typeUser = ''
$maName = ''
$maFam = ''
$cID = ''
$endName = ''
$endFam = ''
$Gui = GUICreate("Генератор id", 349, 367, 192, 124)
$MenuFile = GUICtrlCreateMenu("Файл")
$MenuExit = GUICtrlCreateMenuItem("Выход", $MenuFile)
$MenuHelp = GUICtrlCreateMenu("Справка")
$MenuAbout = GUICtrlCreateMenuItem("О программе...", $MenuHelp)
$Group1 = GUICtrlCreateGroup("Данные Пользователя", 15, 15, 316, 160)
$nameL = GUICtrlCreateLabel("Имя:", 57, 60, 29, 17)
$sName = GUICtrlCreateInput("", 93, 57, 226, 21)
$famL = GUICtrlCreateLabel("Фамилия:", 30, 96, 56, 17)
$sFam = GUICtrlCreateInput("", 93, 93, 226, 21)
$sTypeUser = GUICtrlCreateCombo("", 93, 129, 223, 25, $CBS_DROPDOWNLIST);не редактируемый
GUICtrlSetData(-1, "тип1"|"тип2", "тип1")
$Label1 = GUICtrlCreateLabel("Тип учетки:", 24, 132, 62, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$idGroup = GUICtrlCreateGroup("Идентификатор", 15, 186, 316, 73)
$id = GUICtrlCreateInput("", 24, 216, 208, 21, $ES_READONLY)
$copy = GUICtrlCreateButton("Копировать", 237, 213, 85, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$start = GUICtrlCreateButton("Генерировать", 15, 276, 316, 46, $WS_GROUP)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    If $nMsg = $MenuExit Then
        ExitLoop
    EndIf
    If $nMsg = $MenuAbout Then
        MsgBox(64, "О программе...","Пример генерации id пользователя")
EndIf

Switch $nMsg
Case $GUI_EVENT_CLOSE
   ExitLoop
Case $sTypeUser
   Switch GUICtrlRead($sTypeUser)
	  Case "тип1"
	  GUICtrlSetData($sTypeUser, "тип1")
	  Case "тип2"
	  GUICtrlSetData($sTypeUser, "тип2")
   EndSwitch
Case $start
    _start()
    GUICtrlSetData( $id, $cID)
Case $copy
    ClipPut ( $cID ) 
EndSwitch
WEnd

Func _start ()
   $name = GUICtrlRead($sName)
   $fam = GUICtrlRead($sFam)
   $typeUser = GUICtrlRead($sTypeUser)
   If $typeUser = 'тип1' Then 
	  _crypt ()
      $cID=$maName[1][2] & $maFam[3][3] & $maName[2][1] & $maFam[1][1] & $maName[3][3] & $maFam[2][2] & '/' & $endName & '/' & $endFam
   Else
	  _crypt ()
      $cID=$maName[1][3] & $maFam[2][1] & $maName[2][2] & $maFam[2][1] & $maName[3][1] & $maFam[3][1] & '/' & $endName & '/' & $endFam
   EndIf
EndFunc     ;==>_start

Func _crypt ()
   Dim $aTop[33][2] = [['а','б'],['б','в'],['в','г'],['г','д'],['д','е'],['е','ё'],['ё','ж'],['ж','з'],['з','и'],['и','й'], _
                      ['й','к'],['к','л'],['л','м'],['м','н'],['н','о'],['о','п'],['п','р'],['р','с'],['с','т'],['т','у'], _
                      ['у','ф'],['ф','х'],['х','ц'],['ц','ч'],['ч','ш'],['ш','щ'],['щ','ъ'],['ъ','ы'],['ы','ь'],['ь','э'], _
                      ['э','ю'],['ю','я'],['я','а'], _
                      
   Dim $aDown[33][2] = [['а','в'],['б','г'],['в','д'],['г','е'],['д','ё'],['е','ж'],['ё','з'],['ж','и'],['з','й'],['и','к'], _
                      ['л','a'],['к','м'],['л','н'],['м','о'],['н','п'],['о','р'],['п','с'],['р','т'],['с','у'],['т','ф'], _
                      ['у','х'],['ф','ц'],['х','ч'],['ц','ш'],['ч','щ'],['ш','ъ'],['щ','ы'],['ъ','ь'],['ы','э'],['ь','ю'], _
                      ['э','я'],['ю','а'],['я','б'], _
                     
   Dim $aCyfer[33][2] = [['а','1'],['б','2'],['в','3'],['г','4'],['д','5'],['е','6'],['ё','7'],['ж','8'],['з','9'],['и','1'], _
                      ['й','2'],['к','3'],['л','4'],['м','5'],['н','6'],['о','7'],['п','8'],['р','9'],['с','1'],['т','2'], _
                      ['у','3'],['ф','4'],['х','5'],['ц','6'],['ч','7'],['ш','8'],['щ','9'],['ъ','1'],['ы','2'],['ь','3'], _
                      ['э','4'],['ю','5'],['я','6'], _
                         
    $aName = StringSplit ( $name, "",0 )
    $aFam = StringSplit ( $fam, "",0 )
    $sNameTop = $name 
    $sNameDown = $name 
    $sNameCyfer = $name
    $sFamTop = $fam 
    $sFamDown = $fam 
    $sFamCyfer = $fam
    For $i = 0 To $i = 33 -1 ; если вместо $i=33 пишу UBound($aTop), то вобще не обрабатывается((
        $sNameTop = StringRegExpReplace($sNameTop, $aTop[$i][0], $aTop[$i][1])
        $sFamTop = StringRegExpReplace($sFamTop, $aTop[$i][0], $aTop[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameDown = StringRegExpReplace($sNameDown, $aDown[$i][0], $aDown[$i][1])
    $sFamDown = StringRegExpReplace($sFamDown, $aDown[$i][0], $aDown[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameCyfer = StringRegExpReplace($sNameCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    $sFamCyfer = StringRegExpReplace($sFamCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    Next
   $aNameTop = StringSplit ($sNameTop, "",0 )
   $aNameDown = StringSplit ($sNameDown, "",0 )
   $aNameCyfer = StringSplit ($sNameCyfer, "",0 )
   $aFamTop = StringSplit ($sFamCyfer, "",0 )
   $aFamDown = StringSplit ($sFamCyfer, "",0 )
   $aFamCyfer = StringSplit ($sFamCyfer, "",0 )
   ;_ArrayDisplay($aNameTop)
   ;_ArrayDisplay($aNameDown)
   ;_ArrayDisplay($aNameCyfer)
   ;_ArrayDisplay($aFamTop)
   ;_ArrayDisplay($aFamDown)
   ;_ArrayDisplay($aFamCyfer)
   $endName = StringTrimLeft ( $sNameTop, 3 )
   $endFam = StringTrimLeft ( $sFamDown, 3 )
   $maName = _makeArrays($aName, $aNameTop, $aNameDown, $aNameCyfer)
   $maFam = _makeArrays($aFam, $aFamTop, $aFamDown, $aFamCyfer)
   _ArrayDisplay($maName)
   _ArrayDisplay($maFam)
EndFunc     ;==>_crypt

Func _makeArrays(ByRef $array1, ByRef $array2 , ByRef $array3, ByRef $array4)
    Local $results[UBound($array1)][4]
    Local $iSize = UBound($array1) - 1
    For $i = 0 To $iSize
        If UBound($array1) > $i Then $results[$i][0] = $array1[$i]
        If UBound($array2) > $i Then $results[$i][1] = $array2[$i]
        If UBound($array3) > $i Then $results[$i][2] = $array3[$i]
        If UBound($array4) > $i Then $results[$i][3] = $array4[$i]
    Next
    Return $results
EndFunc   ;==>_makeArrays


Но, проблема в том что этот участок кода некорректно обрабатывается:

Код:
For $i = 0 To $i = 33 -1 ; если вместо $i=33 пишу UBound($aTop), то вобще не обрабатывается((
        $sNameTop = StringRegExpReplace($sNameTop, $aTop[$i][0], $aTop[$i][1])
        $sFamTop = StringRegExpReplace($sFamTop, $aTop[$i][0], $aTop[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameDown = StringRegExpReplace($sNameDown, $aDown[$i][0], $aDown[$i][1])
    $sFamDown = StringRegExpReplace($sFamDown, $aDown[$i][0], $aDown[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameCyfer = StringRegExpReplace($sNameCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    $sFamCyfer = StringRegExpReplace($sFamCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    Next

Помогите, плз, разобраться...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Неужели никто не в состоянии помочь?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
тема почищена от флуда. виновным предупреждения.
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Скрипт C2H5OH довольно таки интересный (взял на заметку), но не совсем подходит для данной задачи, т.к. переменная должна формироваться аналогично
Код:
$cID=$maName[1][2] & $maFam[3][3] & $maName[2][1] & $maFam[1][1] & $maName[3][3] & $maFam[2][2] & '/' & $endName & '/' & $endFam

Причины:
1) порядок формирования конечной переменной периодически может меняться и удобно когда все изменения делаются в 1 строке
2) для усложнения расшифровки, в переменную могут добавляться мусорные символы, которые при расшифровке игнорируются. В цикле такое делать менее удобно

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Белый,
ты хочешь в своей функции ошибки исправить или затянуть в свой скрипт стороннюю реализацию шифрования?
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
ты хочешь в своей функции ошибки исправить или затянуть в свой скрипт стороннюю реализацию шифрования?
Еще не определился как будет более рационально, но почему не корректно обрабатывается кусок кода, приведенный выше, хотелось бы для себя выяснить...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Наверное потому что, как следует из твоих слов, ты собирался перемешать строки $name и $fam, а потом шифровать полученную смесь - 1-ый символ по массиву $aTop, 2-ой символ по массиву $aDown, 3-ий символ по массиву $aCyfer.
А вместо этого ты шифруешь ВСЮ СТРОКУ $sName и ВСЮ СТРОКУ $sFam по массиву $aTop, по массиву $aDown, по массиву $aCyfer.
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
следует из твоих слов, ты собирался перемешать строки $name и $fam, а потом шифровать полученную смесь - 1-ый символ по массиву $aTop, 2-ой символ по массиву $aDown, 3-ий символ по массиву $aCyfer.
Да и после этого добавил
Вот значительно упростил пример. Помогите хотя бы на примере этого...
а после для уточнения указал набросок кода который соответствует запросу, но не идеален в исполнении...
также интересно почему некоректно обрабатывается кусок:
Код:
For $i = 0 To $i = 33 -1 ; если вместо $i=33 пишу UBound($aTop), то вобще не обрабатывается((
        $sNameTop = StringRegExpReplace($sNameTop, $aTop[$i][0], $aTop[$i][1])
        $sFamTop = StringRegExpReplace($sFamTop, $aTop[$i][0], $aTop[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameDown = StringRegExpReplace($sNameDown, $aDown[$i][0], $aDown[$i][1])
    $sFamDown = StringRegExpReplace($sFamDown, $aDown[$i][0], $aDown[$i][1])
    Next
    For $i = 0 To $i = 33 -1
    $sNameCyfer = StringRegExpReplace($sNameCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    $sFamCyfer = StringRegExpReplace($sFamCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
    Next
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты в строке $sNameTop меняешь ВСЕ СИМВОЛЫ по массиву $aTop
Код:
For $i = 0 To $i = 33 -1 
        $sNameTop = StringRegExpReplace($sNameTop, $aTop[$i][0], $aTop[$i][1])
Next


Потом в строке $sNameDown меняешь ВСЕ СИМВОЛЫ по массиву $aDown
Код:
For $i = 0 To $i = 33 -1 
    $sNameDown = StringRegExpReplace($sNameDown, $aDown[$i][0], $aDown[$i][1])
Next


Потом в строке $sNameCyfer меняешь ВСЕ СИМВОЛЫ по массиву $aDown
Код:
For $i = 0 To $i = 33 -1 
    $sNameCyfer = StringRegExpReplace($sNameCyfer, $aCyfer[$i][0], $aCyfer[$i][1])
Next


Где ж тут перебор 1-ый, 2-ой, 3-ий символ ?
( Кстати, гуру AutoIt, насколько корректен такой цикл?
Код:
For $i = 0 To $i = 33 -1
)

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

beliy

Продвинутый
Сообщения
372
Репутация
72
Где ж тут перебор 1-ый, 2-ой, 3-ий символ ?
в моем варианте сначала получаем массив со всеми возможными данными, а потом комбинируем по принципу мозаики - такой подход менее быстрый, но более гибкий для получения конечного результата.
Интересует какая ошибка в данном цикле (обработывает только 1 символ массива)?
Также интересует сравнительная характеристика стандартного массива и массива предложенного C2H5OH
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ммм... В твоём коде ты получаешь три копии строки - зашифрованные по 1-му, 2-му и 3-му массивам. Но дальше ты с ними ничего не делаешь. Фаза
а потом комбинируем по принципу мозаики
у тебя отсутствует. То есть ты не дописал до конца реализацию своего алгоритма. Тогда откуда возникает вопрос что что-то не работает, если код не закончен??

У меня не просто массив, у меня совершенно другой метод, который не использует StringRegExp. Такой подход имеет преимущество по скорости выполнения. Если речь идёт о потоковом шифровании, то мой метод лучше. Если у тебя планируется разовая акция, то бери код в котором тебе легче разобраться.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А RSA алгоритм вас чем не устраивает? имхо прекрасно работает и тем более без использования регекспов.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Belfigor,
это к ТСу. :smile:
Вообще-то это не полноценный алгоритм шифрования, он работает только в одну сторону - зашифрованный текст невозможно будет расшифровать.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
RSA то? Это алгоритм обратного шифрования. Сообщения легко шифруются туда и обратно.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Та я в курсе про RSA.
Я говорю что ТС придумал свой алгоритм и хочет его написать в автоите. Но его(ТСа) алгоритм работает только в одну сторону - расшифровка текста, закодировнного по его(ТСа) алгоритму невозможна из-за неоднозначности соответствия в 3-ей таблицы.
 
Верх