Что нового

Криптография Конвертор для хранения приватных шифрованных строк/паролей в открытом доступе

Vic58

Знающий
Сообщения
24
Репутация
10
Версия AutoIt
3.3.14.5
Версия
2.6
Позволяет просто, без использования криптографических библиотек, создавать защищенные реплики (клоны, различающиеся внешним видом) информации, пригодные для хранения напр. в INI файлах. С точки зрения надежности, - это механизм подобный двухпроходному шифрованию с приватным ключом, в котором количество неизвестных всегда больше количества возможных уравнений математической модели. Конечно, после публикации криптографическая стойкость оригинального механизма падает, но на то он и исходник - рыба, что бы вы могли внести свою "долю яда" для любой модели.

Код:
#cs  ; V1.0
 Syntax.:   $password = pass_tran($pass_str,[$pass_key, [$word_lngth, $encrypt]])

 Where..:   <$pass_str>   =   Строка для шифрования/дешифрования, в зависимости от значения параметра <$encrypt>
             <$pass_key>   =   Ключевая фраза (приватный ключ) шифрования/дешифрования, не менее 8 символов.
            <$word_lngth> =   Длина ЗАШИФРОВАННОГО рабочего пароля, чем длинее <$word_lngth> и <$pass_key>, тем сложнее подобрать ключ.
            <$encrypt>    = 1 ШИФРОВАТЬ пароль, 0 РАСШИФРОВАТЬ пароль (default)
 Returns:   Зашифрованная или расшифрованная версия строки, переданная в параметре <$pass_str>,
            в зависимости от значения параметра <$encrypt>. Функция не возвращает ошибок.
#ce
;~ #cs       Примеры:
$s_pass="Саня Масяня <[email protected]>|AbCd_@12345"
$s_encr=pass_tran($s_pass, '', 20, 1)
$s_decr=pass_tran($s_encr)
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_encr=pass_tran($s_pass, 'Для примера: Key String!!!', 20, 1)
$s_decr=pass_tran($s_encr, 'Для примера: Key String!!!')
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_decr=pass_tran($s_encr, 'Для примера: Key String !!')
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
;~ #ce

Func pass_tran($pass_str, $pass_key='', $word_lngth=0, $encrypt=0)
Local $wrk_string, $wrk_pass, $wrk_char, $wrk_key, $wrk_len, $offset, $ptr1, $ptr2, $dat1
Const $_mod=62  ;модуль транскриптора, предельно передаваемый/возвращаемый код 62*62=3844
Const $_masc=255 ;модуль размера таблицы символов 255-ASCII
      $pass_str=StringStripWS($pass_str,1) ;+2
      If Not $pass_str Then Return ""
      If StringLen($pass_str)+1 > $word_lngth Then $word_lngth=StringLen($pass_str)+2
      If $pass_key and StringLen($pass_key)>7 Then  ; ключ короче 8 символов это что закрыть дверь на веревочку
          $wrk_key = $pass_key
      Else ; по умолчанию здесь может быть загружен фрагмент какого либо файла либо строка на ваше усмотрение
          $wrk_key = "Enter Your private key string (or ASCII code string) as default, обязательно замените на собственный ключ !!!"
;~           $wrk_key = StringMid(FileRead("myfile.txt"),$x1,$x2)  ; где $x1,$x2 - начало и размер выборки, напр: $x1=77, $x2=512
                    ; в этом случае файл, сами понимаете, не должен редактироваться и содержать нулевых байтов
      EndIf
IF $encrypt Then          ; шифрование строки
      $wrk_string = $pass_str
     For $i=1 To $word_lngth-StringLen($pass_str)
        $wrk_string&=" "
     Next
      $wrk_pass=''
      $wrk_char=''
; --- конвертор реплик, случайный код ascii для символа смещения
      $offset = Random(1,61,1) ;будет существовать 61 реплика шифра - до 255
      $wrk_len=StringLen($pass_str)
      $wrk_pass = chr($offset)    ; Сохранить символ смещения как первый
    FOR $i=1 TO $word_lngth
          $wrk_char = StringMid($wrk_string,$i,1)
          $wrk_char = CHR(MOD(ASC($wrk_char)+$offset,$_masc)+1)
          $wrk_pass &= $wrk_char
          $offset = ASC($wrk_char)
    Next
      $offset=0
    For $j=2 To StringLen($wrk_pass)
          $offset+=Asc(StringMid($wrk_pass,$j,1))
    Next
      $offset=mod($offset,$_masc)
      $wrk_pass = CHR(MOD(Asc(StringMid($wrk_pass,1,1))+$offset,$_masc)+1)&StringMid($wrk_pass,2)
      $wrk_string=$wrk_pass
; --- второй уровень, собственно шифрование - используются два "временных" ключа
    $wrk_pass=""
    $wrk_len=StringLen($wrk_key)
    $ptr1=Int($wrk_len/2)
    $ptr2=$ptr1+1
Local $aPC[StringLen($wrk_string)+1]
    $aPC[0]=StringLen($wrk_string)
  For $i=1 To $aPC[0]
     $aPC[$i]=Asc(StringMid($wrk_string,$i,1))
     $dat1=Asc(StringMid($wrk_key,$ptr1,1))
     $aPC[$i]=BitXOR($aPC[$i],$dat1)    ;1 элемент шифрования
;~  $aPC[$i]+=$dat1                    ; или так, или так и так
     $ptr1 = Mod($ptr1+$i+$dat1,$wrk_len)+1
     $dat1=Asc(StringMid($wrk_key,$ptr2,1))
     $aPC[$i]+=$dat1                    ;2 элемент шифрования
     $ptr2 = Mod($ptr2-$i-$dat1,$wrk_len)+1
     If $ptr2<1 Then $ptr2 += $wrk_len
;~  if $i>1 Then $aPC[$i]=$aPC[$i]+$aPC[$i-1]  ;тоже можно
  Next
; --- Транскиптор в печатный вид
    $wrk_pass=""
  For $j=1 To $aPC[0]  ;StringLen($wrk_string)
     $outdat=""
   for $i=1 to 2
     if $i =1 Then
        $dat1=Int($aPC[$j]/$_mod)+1
     Else
        $dat1=Mod($aPC[$j],$_mod)+1
     EndIf
     Switch $dat1
      Case 1 To 26
        $outdat&=Chr($dat1+64)
      Case 27 To 36
        $outdat&=Chr($dat1+48-27)
      Case Else
        $outdat&=Chr($dat1+97-37)
     EndSwitch
   Next
     $wrk_pass&=$outdat
  Next
    $wrk_string=$wrk_pass
    $dat1=StringLen($wrk_string)
    $ptr1=0
    $ptr2=0
    $wrk_pass=''
    FOR $i=1 TO $dat1     ; Разобрать символы из рабочей строки с перестановкой (устранение регулярности)
        If mod($i,2) Then
          $wrk_pass &= StringMid($wrk_string,$dat1-$ptr1,1)
          $ptr1+=1
        Else
          $ptr2+=1
          $wrk_pass &= StringMid($wrk_string,$ptr2,1)
        EndIf
    Next
ELSE   ; расшифровка... все строго в обратном порядке, иначе до исходного текста не добраться
    $ptr1=0
    $ptr2=0
    $dat1=StringLen($pass_str)
 Local $aPS[$dat1+1]
    $aPC=StringSplit($pass_str,"")
   FOR $i=1 TO $aPC[0]     ; обратная перестановка
        If mod($i,2) Then
          $aPS[$dat1-$ptr1] = $aPC[$i]
          $ptr1+=1
        Else
          $ptr2+=1
          $aPS[$ptr2] = $aPC[$i]
        EndIf
   Next
    $wrk_string=""
   For $i=1 To $dat1
        $wrk_string&=$aPS[$i]
   Next
; --- обратный трнскриптор
    $dat1=StringLen($wrk_string)
Local $aPC[int($dat1/2)+1]
    $aPC[0]=int($dat1/2)
    $ptr1=0
    $wrk_pass=""
  for $j=1 to StringLen($wrk_string) Step 2
    $outdat=0
    $ptr1+=1
    $wrk_char=StringMid($wrk_string,$j,2)
   for $i=1 to 2
     $dat1=Asc((StringMid($wrk_string,$j+$i-1,1)) ) ;-1)
     Switch $dat1
      Case 64 To 90
        $outdat+=$dat1-65 ;1..26
      Case 48 To 57
        $outdat+=$dat1-48+26 ;27..36
      Case Else
        $outdat+=$dat1-97+36 ;37..
     EndSwitch
      if $i =1 Then $outdat=$outdat*$_mod
   Next
    $wrk_pass&=Chr($outdat)
    $aPC[$ptr1]=$outdat
  Next
    $wrk_string=$wrk_pass
; --- дешифровка (и снова две собаки на рояле)
    $wrk_pass=""
    $outdat=""
    $wrk_len=StringLen($wrk_key)
    $ptr1=Int($wrk_len/2)
    $ptr2=$ptr1+1
 For $i=1 To $aPC[0]
    $dat1=Asc(StringMid($wrk_key,$ptr2,1))
    $aPC[$i]-=$dat1        ;вернуть 2 элемент шифрования
    $ptr2 = Mod($ptr2-$i-$dat1,$wrk_len)+1
    If $ptr2<1 Then $ptr2 += $wrk_len
    $dat1=Asc(StringMid($wrk_key,$ptr1,1))
;~  $aPC[$i]-=$dat1
    $aPC[$i]=BitXOR($aPC[$i],$dat1)    ;вернуть 1 элемент шифрования
    $ptr1 = Mod($ptr1+$i+$dat1,$wrk_len)+1
    $outdat&=Chr($aPC[$i])
 Next
; --- реставрация реплики
    $offset=0
  For $i=2 To StringLen($outdat)
        $offset+=Asc(StringMid($outdat,$i,1))
  Next
    $dat1=Asc(StringMid($outdat,1,1))-mod($offset,$_masc)-1
    If $dat1<0 Then $dat1+=$_masc  ;
    $outdat = CHR($dat1)&StringMid($outdat,2)
    $offset = Asc(StringMid($outdat,1,1))
  FOR $i=2 TO $aPC[0]   ;$wrk_len
      $wrk_char = StringMid($outdat,$i,1)
      IF ASC($wrk_char) <= $offset Then
            $dat1=$_masc+ASC($wrk_char)-$offset-1
      ELSE
            $dat1=ASC($wrk_char)-$offset-1
      ENDIF
      If Not $dat1 Then $dat1=$_masc
      $wrk_pass &= Chr($dat1)
      $offset = ASC($wrk_char)
  Next
    $wrk_pass = StringStripWS($wrk_pass,2) ;1 --- вуаля
ENDIF
RETURN $wrk_pass
EndFunc

Функция выделена из моей очень старой рабочей.
Более подробное описание в комментах прикрепленного первого архива
Сообщение автоматически объединено:


Обновил до версии 2.5. Существенно улучшена криптостойкость шифра, - все основные моменты генерации теперь привязаны к приватному ключу. Уже недостаточно подобрать два временных ключа, хотя и это было бы непросто. Сравнив с предыдущей версией легко понять, где лучше встроить собственные "фишки". При смене версии старые шифры придется генерить заново.

Код:
#cs  ;V2.5 Vic58
 Syntax.:   $password = pass_tran($pass_str,[$pass_key, [$word_lngth, $encrypt]])

 Where..:   <$pass_str>   =   Строка для шифрования/дешифрования, в зависимости от значения параметра <$encrypt>
            <$pass_key>   =   Ключевая фраза (приватный ключ) шифрования/дешифрования, не менее 8 символов.
            <$word_lngth> =   Длина ЗАШИФРОВАННОГО рабочего пароля, чем длинее <$word_lngth> и <$pass_key>, тем сложнее подобрать ключ.
            <$encrypt>    = 1 ШИФРОВАТЬ пароль, 0 РАСШИФРОВАТЬ пароль (default)
 Returns:   Зашифрованная или расшифрованная версия строки, переданная в параметре <$pass_str>,
            в зависимости от значения параметра <$encrypt>. Функция не возвращает ошибок.
#ce
;~ #cs       Примеры:
$s_pass="Саня Масяня <[email protected]>|AbCde_@12345"
$s_encr=pass_tran($s_pass, '', 50, 1)
$s_decr=pass_tran($s_encr)
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_encr=pass_tran($s_pass, 'Для примера: Key String!!!', 0, 1)
$s_decr=pass_tran($s_encr, 'Для примера: Key String!!!')
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_decr=pass_tran($s_encr, 'Для примера: Key String !!')
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
;~ #ce

Func pass_tran($pass_str, $pass_key='', $word_lngth=0, $encrypt=0)
Local $wrk_string, $wrk_pass, $wrk_char, $wrk_key, $wrk_len, $offset, $ptr1, $ptr2, $dat1
Const $_mod=62  ;модуль транскриптора, предельно передаваемый/возвращаемый код 62*62=3844
Const $_masc=255 ;модуль размера таблицы символов: 255-ASCII
      $pass_str=StringStripWS($pass_str,3)
      If Not $pass_str Then Return ""
      If StringLen($pass_str)+1 > $word_lngth Then $word_lngth=StringLen($pass_str)+2
      If $pass_key and StringLen($pass_key)>7 Then  ; ключ короче 8 символов это что закрыть дверь на веревочку
          $wrk_key = $pass_key
      Else ; по умолчанию здесь может быть загружен фрагмент какого либо файла либо строка на ваше усмотрение
          $wrk_key = "Enter Your private key string (or ASCII code string) as default, обязательно замените на собственный ключ !!!"
;~           $wrk_key = StringMid(FileRead("myfile.txt"),$x1,$x2)  ; где $x1,$x2 - начало и размер выборки, напр: $x1=77, $x2=512
                    ; в этом случае файл, сами понимаете, не должен редактироваться и содержать нулевых байтов
      EndIf
IF $encrypt Then          ; шифрование строки
      $wrk_string = $pass_str
     For $i=1 To $word_lngth-StringLen($pass_str)
        $wrk_string=" " & $wrk_string
     Next
; --- конвертор реплик (1 проход), случайный код ascii для символа смещения
      $offset = Random(1,61,1) ;будет существовать 61 реплика шифра - до 255
      $wrk_len=StringLen($pass_str)
      $wrk_pass = chr($offset)    ; Сохранить символ смещения как первый
    FOR $i=1 TO $word_lngth        ; соберем реплику с добавлением зависимости от ключа
       $wrk_char = CHR(MOD(ASC(StringMid($wrk_string,$i,1))+$offset+ASC(StringMid($wrk_key,MOD($offset+$i,StringLen($wrk_key)),1))+$i,$_masc)+1)
       $wrk_pass &= $wrk_char
       $offset = ASC($wrk_char)
    Next
      $offset=0
    For $j=2 To StringLen($wrk_pass)
        $offset+=Asc(StringMid($wrk_pass,$j,1))
    Next
      $offset=mod($offset,$_masc)
      $wrk_string = StringTrimLeft($wrk_pass,1) & CHR(MOD(Asc(StringMid($wrk_pass,1,1))+$offset,$_masc)+1)
; --- второй уровень, собственно шифрование - используются два "временных" виртуальных ключа, два прохода
    $wrk_pass=""
    $wrk_len=StringLen($wrk_key)
    $wrk_char=Asc(StringMid($wrk_key,$wrk_len-1))
    $ptr1=Int($wrk_len/2)  ; Кто сказал что старт для виртуальных ключей надо начинать с середины ключя?
    $ptr2=$ptr1+1          ; стартовую позицию лучше найти в самом ключе из соотношения какиз либо частей
Local $aPC[StringLen($wrk_string)+1]
    $aPC[0]=StringLen($wrk_string)
  For $i=1 To $aPC[0]
     $dat1=Asc(StringMid($wrk_key,$ptr1,1))
     $aPC[$i]=BitXOR(Asc(StringMid($wrk_string,$i,1)),$dat1)    ;1 элемент шифрования
     $ptr1 = Mod($ptr1+$i+$dat1,$wrk_len)+1
     $dat1=Asc(StringMid($wrk_key,$ptr2,1))
     $ptr2 = Mod($ptr2-$i-$dat1,$wrk_len)+1
     $aPC[$i]+=BitXOR($dat1,Mod($wrk_char+$i,$_masc))    ;2 элемент шифрования, предельный разброс от 0 до 510 на выходе
     If $ptr2<1 Then $ptr2 += $wrk_len                ;транскриптор позволяет до 3800, подумайте сами, чтоб ещё, по тяму надо.
      $wrk_char=$aPC[$i]
  Next
; --- Транскиптор в печатный вид
    $wrk_pass=""
  For $j=1 To $aPC[0]
     $outdat=""
   for $i=1 to 2
     if $i =1 Then
        $dat1=Int($aPC[$j]/$_mod)+1
     Else
        $dat1=Mod($aPC[$j],$_mod)+1
     EndIf
     Switch $dat1
      Case 1 To 26
        $outdat&=Chr($dat1+64)
      Case 27 To 36
        $outdat&=Chr($dat1+48-27)
      Case Else
        $outdat&=Chr($dat1+97-37)
     EndSwitch
   Next
     $wrk_pass&=$outdat
  Next
    $wrk_string=$wrk_pass
    $dat1=StringLen($wrk_string)
    $ptr1=0
    $ptr2=0
    $wrk_pass=''
    FOR $i=1 TO $dat1     ; Разберем символы из рабочей строки с перестановкой по ключу (устранение регулярности)
        If mod(Asc(StringMid($wrk_key,Mod($i,StringLen($wrk_key))+1,1)),2) Then
          $wrk_pass &= StringMid($wrk_string,$dat1-$ptr1,1)
          $ptr1+=1
        Else
          $ptr2+=1
          $wrk_pass &= StringMid($wrk_string,$ptr2,1)
        EndIf
    Next
ELSE   ; расшифровка... все строго в обратном порядке, иначе до исходного текста не добраться
    $ptr1=0
    $ptr2=0
    $dat1=StringLen($pass_str)
 Local $aPS[$dat1+1]
    $aPC=StringSplit($pass_str,"")
   FOR $i=1 TO $aPC[0]     ; обратная перестановка
        If mod(Asc(StringMid($wrk_key,Mod($i,StringLen($wrk_key))+1,1)),2) Then
          $aPS[$dat1-$ptr1] = $aPC[$i]
          $ptr1+=1
        Else
          $ptr2+=1
          $aPS[$ptr2] = $aPC[$i]
        EndIf
   Next
    $wrk_string=""
   For $i=1 To $dat1
        $wrk_string&=$aPS[$i]
   Next
; --- обратный трнскриптор
    $dat1=StringLen($wrk_string)
Local $aPC[Int($dat1/2)+1]
    $aPC[0]=int($dat1/2)
    $ptr1=0
    $wrk_pass=""
  for $j=1 to StringLen($wrk_string) Step 2
    $outdat=0
    $ptr1+=1
    $wrk_char=StringMid($wrk_string,$j,2)
   for $i=1 to 2
     $dat1=Asc((StringMid($wrk_string,$j+$i-1,1)) ) ;-1)
     Switch $dat1
      Case 64 To 90
        $outdat+=$dat1-65 ;1..26
      Case 48 To 57
        $outdat+=$dat1-48+26 ;27..36
      Case Else
        $outdat+=$dat1-97+36 ;37..
     EndSwitch
      if $i =1 Then $outdat=$outdat*$_mod
   Next
    $wrk_pass&=Chr($outdat)
    $aPC[$ptr1]=$outdat
  Next
    $wrk_string=$wrk_pass
; --- дешифровка (и снова "две собаки на рояле")
    $wrk_pass=""
    $outdat=""
    $wrk_len=StringLen($wrk_key)
    $wrk_char=Asc(StringMid($wrk_key,$wrk_len-1))
    $ptr1=Int($wrk_len/2)
    $ptr2=$ptr1+1
 For $i=1 To $aPC[0]
    $dat1=Asc(StringMid($wrk_key,$ptr2,1))
    $ptr2 = Mod($ptr2-$i-$dat1,$wrk_len)+1
    $offset = $aPC[$i]
    $aPC[$i]-=BitXOR($dat1,Mod($wrk_char+$i,$_masc))    ;вернуть 2 элемент шифрования
    If $ptr2<1 Then $ptr2 += $wrk_len
    $dat1=Asc(StringMid($wrk_key,$ptr1,1))
    $aPC[$i]=BitXOR($aPC[$i],$dat1)    ;вернуть 1 элемент шифрования
    $ptr1 = Mod($ptr1+$i+$dat1,$wrk_len)+1
    $outdat&=Chr($aPC[$i])
    $wrk_char=$offset
 Next
; --- реставрация реплики
    $outdat=Chr($aPC[$aPC[0]]) & StringTrimRight($outdat,1)
    $offset=0
  For $i=2 To StringLen($outdat)
        $offset+=Asc(StringMid($outdat,$i,1))
  Next
    $dat1=Asc(StringMid($outdat,1,1))-mod($offset,$_masc)-1
    If $dat1<0 Then $dat1+=$_masc  ;
    $outdat = CHR($dat1)&StringMid($outdat,2)
    $offset = Asc(StringMid($outdat,1,1))  ;1 символ смещения от Random()
;  FOR $i=2 TO $aPC[0]  ; начнем со 2-го, "делового"
  FOR $i=2 TO StringLen($outdat) ;$aPC[0]  ; начнем со 2-го, "делового"
      $wrk_char = StringMid($outdat,$i,1)
      $dat1=ASC($wrk_char)-Mod($offset+$i+ASC(StringMid($wrk_key,MOD($offset+$i-1,$wrk_len),1)),$_masc)
      If $dat1<1 Then $dat1+=$_masc
      $wrk_pass &= Chr($dat1)
      $offset = ASC($wrk_char)
  Next
    $wrk_pass = StringStripWS($wrk_pass,3) ;1 --- вуаля
ENDIF
RETURN $wrk_pass
EndFunc


2.6: учтены ошибки и усложнен механизм шифрования, передача всех символов с кодами от 1 до 255
3.0: в комментах различные типы шифрования, передача кодов ограничена пользовательским массивом (несовместима с 2.6), если все непечатные и неиспользуемые символы в массиве заменены, то дешифрование становится утомительным, по причине что все отклики читабельны. Не нарушайте законов - и ни кто не будет декомпилировать Вашу программу.


.
 
Автор
Vic58

Вложения

  • Pass_Tran.zip
    4.9 КБ · Просмотры: 6
  • Pass_Tran_2_5.zip
    3.3 КБ · Просмотры: 3
  • Pass_Tran_2_6.zip
    3.6 КБ · Просмотры: 3
  • Pass_Tran_3_1.zip
    4.1 КБ · Просмотры: 3
Последнее редактирование:

prospalo1226

Новичок
Сообщения
1
Репутация
2
Вот, поэтому никто и не делится своими наработками... А когда кто-то делится, то его сначала максимально вежливо обольют грязью, а потом всё-равно будут использовать его наработки в своих целях. Автору спасибо, что поделился.
 
Автор
V

Vic58

Знающий
Сообщения
24
Репутация
10
Спасибо форумчанам за поддержку. Все правильно, и, возможно, не надо реагировать. Но мой многолетний опыт работы в ВУЗе говорит, - если не обращать внимания, то вскоре мы можем стать свидетелями борьбы флудил первого уровня с флудилами второго и т.д.
Этот форум посвящен AutoIt, и давайте не использовать "в то время когда космические корабли бороздят просторы ...", "достижения современной ..." и прочее бла-бла-бла снятое с языка или с ануса. Давайте общаться примерами скриптов и вариантами их улучшения.
И еще. Все современные механизмы шифрования минимум двухпроходные. как бы это гарантирует надежность и в то же время... В этом кроется математика. Например, циклический код Грея (смещенная контрольная сумма) позволяет восстановить потерянный
Сообщение автоматически объединено:

Спасибо форумчанам за поддержку. Все правильно, и, возможно, не надо реагировать. Но мой многолетний опыт работы в ВУЗе говорит, - если не обращать внимания, то вскоре мы можем стать свидетелями борьбы флудил первого уровня с флудилами второго и т.д.
Этот форум посвящен AutoIt, и давайте не использовать "в то время когда космические корабли бороздят просторы ...", "достижения современной ..." и прочее бла-бла-бла снятое с языка или с ануса. Давайте общаться примерами скриптов и вариантами их улучшения.
И еще. Все современные механизмы шифрования минимум двухпроходные. как бы это гарантирует надежность и в то же время... В этом кроется математика. Например, циклический код Грея (смещенная контрольная сумма) позволяет восстановить "потерянный" бит, и байт, а двухпроходный механизм (умножение сначала на первую цифру, потом на вторую...) проверки механических счетных устройств (немецкие математики), умножьте 12345679 на двухзначное число в сумме 9, напр. 27, 36, 18, и вы получите правильность мех.вычисления, никакого чуда, только математика. Удивительно, почему прослушивали Меркель в прямом эфире в защищенном канале.
В общем, скоро опубликую еще два варианта функции (нет времени) и на этом можно закончить, т.к. остальное будет все понятно.
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
279
Репутация
74
Большое спасибо автору!

Очень пригадилось в ини-файлах.
Решил встроитъ ваш конвертор в свой проект.
Особо мне не хочется в моих INI в открытом виде показывать некоторые строки.
И даже без паролля и длиной = 0 будет для меня вполне достаточным.
Смастерил даже для удобства функции для секций (см. ниже)

Лиш одно маленькое примечание.
Самый последний параметр я бы переставил на вторую позицию и сделал обязательным.
Потому что если использовать как предлагаете Вы,
Например:
Код:
$Test = "i|unbe|defekt|Aufzug"
$return = pass_tran($Test)

то вознокает ошибка.

Но если сделать как я говорил выше, тоесть
Код:
$return = pass_tran($Test,1) ; 1 => ШИФРОВАТЬ пароль, 0 => РАСШИФРОВАТЬ пароль

то всё работает как и нужно
Сделал отдельные функции для работы с секзиями INI
Код:
Func _IniReadSection_PassTran($sIniPfad, $sSection, $pass_key="", $word_lngth=0)
    Local $aIniAttay = IniReadSection($sIniPfad, $sSection)
    If @error Then
        Dim $aIniAttay[1][2] = [[0]]
    Else
        For $nN = 1 To $aIniAttay[0][0]
            $aIniAttay[$nN][1] = Pass_Tran($aIniAttay[$nN][1], 0, $pass_key, $word_lngth)
        Next
    EndIf
    Return $aIniAttay
EndFunc

Func _IniWriteSection_PassTran($sIniPfad, $sSection, $iData, $nIndx=1, $pass_key="", $word_lngth=0)
    If IsArray($iData) Then
        For $nN = $nIndx To UBound($iData)-1
            $iData[$nN][1] = Pass_Tran($iData[$nN][1],1,$pass_key,$word_lngth)
        Next
    Else
        Local $aZwArr = StringRegExp($iData, "(.+?\=)(.+?)\h*(?:\@LF\h*|$)", 3)
        $iData = ""
        For $nN = 0 To UBound($aZwArr)-1 Step 2
            $iData &= $aZwArr[$nN] & Pass_Tran($aZwArr[$nN+1],1,$pass_key,$word_lngth) & @LF
        Next
        $iData = StringTrimRight($iData, 3)
    EndIf
    IniWriteSection($sIniPfad, $sSection, $iData, $nIndx)
EndFunc

P.S.
Добавьте это в начале скрипта.
Это поможет ещё немного улучшить код, но вы наверняка об этом знаете
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_Au3Stripper=y
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
AutoItSetOption("MustDeclareVars", 1)
 
Последнее редактирование:
Автор
V

Vic58

Знающий
Сообщения
24
Репутация
10
Большое спасибо автору!

Очень пригадилось в ини-файлах.
Решил встроитъ ваш конвертор в свой проект.
То, что решили переместить параметр - это правильно, надо все делать удобным, я тоже об этом думал. Но у меня перевесило то, что множество вариантов уже создано под такую структуру, и мне пришлось бы очень долго искать что изменить при модификации алгоритма. Мне уже, повторяюсь, седьмой десяток, и опыт подсказывает, - надо все делать удобнее, но обязательно совместимым с ранее принятыми стандартами, иначе придется "все открывать заново" ну и отлаживать/спотыкаться тоже.
Обнаружилась одна неточность при переносе на AutoIt, несущественная, но позволяющая немного автоматизировать подбор ключа. строку

FOR $i=2 TO $aPC[0] ; начнем со 2-го, "делового"

необходимо заменить на

FOR $i=2 TO StringLen($outdat) ; $aPC[0] ; начнем со 2-го, "делового"

Это не изменит уже зашифрованных строк, но повысит надежность шифрования.
Ваш пример использования шифрования и приведенные функции мне видятся очень полезными и возможно я этим тоже воспользуюсь. На данный момент использую такие свои решения, например, при считывании параметра из INI файла использовалось;
Код:
$Username= IniRead($p_IniFile, $p_sSetSection,"Username", $Username)
$Password= IniRead($p_IniFile, $p_sSetSection,"Password", $Password)

заменяем на и добавляем в конце тела скрипта :
Код:
$Username= PT_IniRead($p_IniFile, $p_sSetSection,"Username", $Username)
$Password= PT_IniRead($p_IniFile, $p_sSetSection,"Password", $Password)
.....

Func PT_IniRead($s_IniFile, $s_SetSection, $s_PName, $s_DefPName="")
Local $PValue, $Encr
local $key="!>В секции {"&$s_SetSection & "} загружен параметр '"& $s_PName &"', анализ " & $s_PName & "=" & $s_DefPName
  ; это строка формирует ключ и немного сворачивает лыжи интересуюмщимся оперативной памятью
$PValue=IniRead($s_IniFile, $s_SetSection, $s_PName, $s_DefPName)
if StringLeft($PValue,1)="*" And StringLeft($PValue,2)<>"**" Then
    $PValue=Pass_Tran(StringTrimLeft($PValue,1), $key)
Else
    If StringLeft($PValue,2)="**" Then $PValue=StringTrimLeft($PValue,1)
    IniWrite($s_IniFile, $s_SetSection, $s_PName, "*" & Pass_Tran($PValue, $key, 28, 1))
    $Encr=Pass_Tran(StringTrimLeft(IniRead($s_IniFile, $s_SetSection, $s_PName, $s_DefPName),1), $key)
;    $f_DebugView='1'  ; флаг отладочного просмотра правильности действия шифрованного элемента вместо выполнения
    If $Encr<>$PValue Then
        Msgbox(0,"?->Ошибка","Невозможно записать параметр в INI файл" & @CRLF & _
               "Ошибка             : 7" & @error & @CRLF & _
               "INI файл         : " & $s_IniFile & @CRLF & _
               "Секция           : " & $s_SetSection & @CRLF & _
               "Параметр         : " & $s_PName & @CRLF & _
               "(.., защита от записи, нет прав, блокирован редактором ...)")
        Exit 7  ; ERRORLEVEL 7 - здесь ошибка записи в INI файл, шифрование недоступно, продолжение прервано
    EndIf
EndIf
Return $PValue
EndFunc


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

В завершение, обновляю функцию Pass_Tran до версий 2.6 и 3.0 в начале темы. Различия:
2.6: учтены ошибки и усложнен механизм шифрования, передача всех символов с кодами от 1 до 255
3.0: в комментах различные типы шифрования, передача кодов ограничена пользовательским массивом (несовместима с 2.6), если все непечатные и неиспользуемые символы в массиве заменены, то дешифрование становится утомительным, по причине что все отклики читабельны. Не нарушайте законов - и ни кто не будет декомпилировать Вашу программу.
 

Norm

Продвинутый
Сообщения
279
Репутация
74
В 3.0 в третьем примере не работает
Код:
Original text: <[email protected]>|AbCde_@12345
Encrypted: BFEXFtCHEm7CEIDrJFUBDzDqC1FblDmELG7DF2VFLCFMHjTDdDSFIGFTCcFfEQrEBB
Decrypted: ö <ÉhFh¥"-:êó~G2b

Есть ещё одна проблема в 2.5 и 2.6 приводящая к ошибке/вылету.
Я исправил так:
Код:
$wrk_pass&=Chr($outdat)
If $nUB <= $ptr1 Then
       Return SetError(-2,0,"")
Else
       $aPC[$ptr1]=$outdat
EndIf

P.S.
Пока останусь 2.5 и не только по тому что меня вполне устраивает, а потому что нужно при каждом обновлении править и подгонять код, объявлять переменные, .....


.
 
Последнее редактирование:
Автор
V

Vic58

Знающий
Сообщения
24
Репутация
10
В 3.0 в третьем примере не работает
Это "негативный" пример с одним измененным символом в ключе дешифрования для понимания важности ключа и тестирования шифрования, если Вы имели в ввиду это:
Код:
$s_pass="Саня Масяня <[email protected]>|AbCde_@12345"
$s_encr=pass_tran($s_pass, '', 50, 1)
$s_decr=pass_tran($s_encr)  ; первый пример
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_encr=pass_tran($s_pass, 'Для примера: Key String!!!', 0, 1)
$s_decr=pass_tran($s_encr, 'Для примера: Key String!!!') ; второй пример
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")
$s_decr=pass_tran($s_encr, 'Для примера: Key String !!') ; изменен один символ в ключе и далее третий пример
MsgBox(0,"Test", "Исходный текст:"& @CRLF  & $s_pass & @CRLF & @CRLF & "Шифрованный:" & @CRLF & $s_encr & @CRLF & @CRLF & "Дешифрованный:"& @CRLF & $s_decr & @CRLF  & @CRLF & "***")

Что касается вылетов, то никогда не было, возможно что-то "заоптимизировал" при переносе на AutoIt. Хорошо бы какой-нибудь пример, что бы разобраться. Буду благодарен. (И не совсем понятно назначение переменной $nUB - что-то от UBound() ? По идее выхода за пределы массива не должно быть, но ..., если возможно - живой пример)
P.S. Смотрю 2.6 не загрузился, поправляю.
Сообщение автоматически объединено:

Покопался в исходниках, возможно ошибка из-за универсального округления в AutoIt:
Код:
; --- обратный трнскриптор
    $dat1=StringLen($wrk_string)
Local $aPC[Int($dat1/2)+1]
    $aPC[0]=$dat1/2

попробуйте заменить на:
Код:
; --- обратный трнскриптор
    $dat1=StringLen($wrk_string)
Local $aPC[Int($dat1/2)+1]
    $aPC[0]=Int($dat1/2)

Сообщение автоматически объединено:

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

Norm

Продвинутый
Сообщения
279
Репутация
74
если Вы имели в ввиду это:
Да

И не совсем понятно назначение переменной $nUB - что-то от UBound() ?
Это начало моего исправления ошибки, или скорее костыль, потому что не было времени с этом долго разбираться. Я не заметил, что там ещё и $nUB есть.
Я сделал так:
Код:
; --- обратный трнскриптор
        $dat1=StringLen($wrk_string)
        Local $nUB = Int($dat1/2)+1
        Dim $aPC[$nUB]
        $aPC[0]=$dat1/2
;.................................................

           $wrk_pass&=Chr($outdat)
            If $nUB <= $ptr1 Then
                Return
            Else
                $aPC[$ptr1]=$outdat
            EndIf

Ваше предположение/исправление не помогло
Эта ошибка проявляется так же в 3.0
Происходит это когда в декодируемой строке, точнее вместо неё подсунули что-то другое и при этом
в ней находйтя спезиальные цимволы, напримр, | или ^^
Код:
$s_decr=pass_tran("TESTXX°HH^^", 'Для примера: Key String!!!')


Вообще, с точки зрения безопасности, функции подобного рода должны дешифровать все что угодно с любым результатом без объявления ошибок, - иначе возможна отладка подбора ключа.
Буду знать, если когда нибудь займусь криптографирей.

Вы насточиво игнорирурте мои P.S.
Может быть вы не понимаете о чем я говорю.
Дело конечно Ваше, (я и сам сейчас всё это пишу в транслите) но просто Ваш код не получается вот так просто взять и встроить в готовый проект,
потому что при компиляции вываливается куча предупреждений и ничего не запускается.
Я уже четвёртый год делаю свой проэкт и приучил себя, а точнее перенял от более опытных разработчиков "строгость и порадкок" в коде.
Хотя по началу это меня страшно бесило. Зачем все эти объявления, если и так всё прекресно работает, думал я.
Но в больших проектах без Орднунга очень тяжело. Но возможно это моё личное мнение или опыт.
Конечно потом, я и 3.0 или более новую версию под себя подгоню, но каждую новую пока нет.
 
Последнее редактирование:
Автор
V

Vic58

Знающий
Сообщения
24
Репутация
10
без Орднунга очень тяжело
Natürlich. Ordnung muss überall sein, auch in der Trunkenheit! Простите мой немецкий, изучал уже давно. Здесь я с Вами полностью согласен, появилось время и сразу добавил Ваши рекомендации из P.S..
Что касается вылетов, то обнаружил что при переносе с Fox-а не учел обязательную четность входящей на декодирование строки. Заклеил:
Код:
Local $aPC[Int($dat1/2)+1]
    $aPC[0]=int($dat1/2)
    $ptr1=0
    $wrk_pass=""
;  for $j=1 to StringLen($wrk_string) Step 2
  for $j=1 to $aPC[0]*2 Step 2

Конкретной реакции на спецсимволы не обнаружил, но на всякий случай дырку тоже заклеил.
Опубликованный ранее механизм 3.0 был более надежным, но давал выбросы за пределы дешифрования при определенных сочетаниях символа пароля и ключа на отдельных репликах, поэтому откатил к 2.6 и назвал 3.1.
(3.0 удаляю, пользоваться не советую, требует доработки). Обновляю функцию Pass_Tran до версий 2.6 и 3.1 в начале темы. Версии 2.6 и 3.1 совместимы по механизму шифрования.
Различия:
2.6: учтены ошибки и усложнен механизм шифрования, передача всех символов с кодами от 1 до 255
3.1: передача кодов ограничена пользовательским массивом (остальное совместимо с 2.6), если все непечатные и неиспользуемые символы в массиве заменены, то дешифрование становится утомительным, по причине что все отклики читабельны.
$s_decr=pass_tran("TESTXX°HH^^", 'Для примера: Key String!!!')
Большое спасибо за найденную ошибку.
 
  • Like
Реакции: Norm
Верх