Что нового

Шифрование данных используя 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
Репутация
622
Я присоединюсь к мнению, что постановка задачи чересчур витиевата. Лучше если на словах объяснить, какие трансформации надо сделать. Прежде чем это сделать, я постараюсь дать краткую информацию, даже если это известно вопрошающему, на всякий случай и указать на явные недочеты существующего ТЗ.

Шифрование - это перевод одного набора данных (скажем А) в другой (скажем 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
Репутация
622
тема почищена от флуда. виновным предупреждения.
 
Автор
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 595
Репутация
938
А RSA алгоритм вас чем не устраивает? имхо прекрасно работает и тем более без использования регекспов.
 

C2H5OH

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

Belfigor

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

C2H5OH

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