Что нового

Кракозябры после дешифрования строки rot

MORFEY1337

Новичок
Сообщения
6
Репутация
0
Здравствуйте, подскажите как решить проблему:

Код:
MsgBox(0, '', Decrypt('›’ґЇБЖјЗПЛґ«СЛМЅЕ‹Љґ»№Д»†ЅРЅ'))
Func Decrypt ($get)
Local $string , $string2
For $string2 = 1 To StringLen($get)
$string = $string & Chr(Asc(StringMid($get, $string2, 1)) - 88)
Next
Return $string
EndFunc

Декодирую на русской винде всё ок, но на винде с другой локализацией получаю такие кракозябры:

0ed287c9c2.jpg
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
на винде с другой локализацией получаю такие кракозябры
А если так:
Код:
$sStr = Decrypt('›’ґЇБЖјЗПЛґ«СЛМЅЕ‹Љґ»№Д»†ЅРЅ')
$sAnsi_Str = BinaryToString(StringToBinary($sStr), 4)

MsgBox(64, @ScriptName, $sAnsi_Str)

Func Decrypt($get)
    Local $string, $string2
    
    For $string2 = 1 To StringLen($get)
        $string = $string & Chr(Asc(StringMid($get, $string2, 1)) - 88)
    Next
    
    Return $string
EndFunc
 
Автор
MORFEY1337

MORFEY1337

Новичок
Сообщения
6
Репутация
0
А если так:
Код:
$sStr = Decrypt('›’ґЇБЖјЗПЛґ«СЛМЅЕ‹Љґ»№Д»†ЅРЅ')
$sAnsi_Str = BinaryToString(StringToBinary($sStr), 4)

MsgBox(64, @ScriptName, $sAnsi_Str)

Func Decrypt($get)
    Local $string, $string2
   
    For $string2 = 1 To StringLen($get)
        $string = $string & Chr(Asc(StringMid($get, $string2, 1)) - 88)
    Next
   
    Return $string
EndFunc
Не всё равно не поддерживает

28f5a6e351.jpg
Я знаю один способ это пропустить ещё раз эту строку к примеру хексом и тогда он дешифрует, но мне это не подходит
Может есть ещё какие другие варианты ?
 
Автор
MORFEY1337

MORFEY1337

Новичок
Сообщения
6
Репутация
0
Откуда берётся строка?
Я уверен что дело в кодировке (юникод), возможно на разных системах текст передаётся по разному.
В смысле откуда берётся, она там и есть
ну тут понятно что дело в кодировке но как сделать что-бы оно поддерживалось на разных локализациях
к примеру я пробовал данный код на VB6 такая же ситуация, а вот на purebasic таких проблем нет
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А что это за Rot такой? их вроде 26 вариантов всего:

Код:
For $i = 1 To 25
    ConsoleWrite(_cipher_Rot(@SystemDir & '\calc.exe', $i, False) & @CRLF)
Next

ConsoleWrite(_cipher_Rot(@SystemDir & '\calc.exe', 47, False) & @CRLF)

;===================================================================================================
; Function Name....:    _cipher_Rot($s_data [, $iRotType = 13 [, $bDecode = False]])
; Description......:    cipher char rotation Rot:1-25, 47
; Parameter(s).....:
;                       $sData:      String to encode/decode
;                       $iRotType:  [Default = 13]; integer 1-18, 25, or 47
;                       $bDecode:   [Default = False]; For rot 1-4, 6-12, 14-17, 19-25 only
; Return Value(s)..:
;                       Success...:  Encoded or Decoded string
;                       Failure...:  Empty string
;                       Error.....:
;                                    1. Empty String
;                                    2. StringToASCIIArray() failed
;                                    3. Passed wrong type of $iRotType
; Requirement(s)...:    N/A
; Author(s)........:    SmOke_N (Ron Nielsen) [email protected]
; Modified.........:    N/A
; Comment(s).......:    Tested with AutoIt 3.3.6.1/3.3.12.0
; Example(s).......:    See example output in comment fields within the include file
;===================================================================================================
Func _cipher_Rot($sData, $iRotType = 13, $bDecode = True)
    If Not StringLen($sData) Then Return SetError(1, 0, "")
    
    Local $aStr = StringToASCIIArray($sData)
    If @error Then Return SetError(2, 0, "")
    
    $iRotType = Int($iRotType)
    Switch $iRotType
        Case 1 To 4, 6 To 12, 14 To 17, 19 To 25 ; alpha only
            For $idat = 0 To UBound($aStr) - 1
                If Not $bDecode Then
                    Switch $aStr[$idat]
                        Case 65 To 90
                            $aStr[$idat] += $iRotType
                            If $aStr[$idat] > 90 Then
                                $aStr[$idat] = ($aStr[$idat] - 90) + 64
                            EndIf
                        Case 97 To 122
                            $aStr[$idat] += $iRotType
                            If $aStr[$idat] > 122 Then
                                $aStr[$idat] = ($aStr[$idat] - 122) + 96
                            EndIf
                    EndSwitch
                Else
                    Switch $aStr[$idat]
                        Case 65 To 90
                            $aStr[$idat] -= $iRotType
                            If $aStr[$idat] < 65 Then
                                $aStr[$idat] = 91 - (65 - $aStr[$idat])
                            EndIf
                        Case 97 To 122
                            $aStr[$idat] -= $iRotType
                            If $aStr[$idat] < 97 Then
                                $aStr[$idat] = 123 - (97 - $aStr[$idat])
                            EndIf
                    EndSwitch
                EndIf
            Next
        Case 5 ;numbers only
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 48 To 52
                        $aStr[$idat] += 5
                    Case 53 To 57
                        $aStr[$idat] -= 5
                EndSwitch
            Next
        Case 13 ;alpha only
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 65 To 90
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 91 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                    Case 97 To 122
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 123 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndSwitch
            Next
        Case 18 ;alpha/numeric only
            $iRotType = 13
            
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 48 To 52
                        $aStr[$idat] += 5
                    Case 53 To 57
                        $aStr[$idat] -= 5
                    Case 65 To 90
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 91 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                    Case 97 To 122
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 123 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndSwitch
            Next
        Case 47 ;all ascii chars
            For $idat = 0 To UBound($aStr) - 1
                If ($aStr[$idat] > 32 And $aStr[$idat] < 127) Then
                    $aStr[$idat] = (($aStr[$idat] + $iRotType < 127) ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndIf
            Next
        Case Else
            Return SetError(3, 0, "")
    EndSwitch
    
    Return StringFromASCIIArray($aStr)
EndFunc ;==>_cipher_Rot
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А что если использовать ChrW вместо Chr?
 
Автор
MORFEY1337

MORFEY1337

Новичок
Сообщения
6
Репутация
0
А что это за Rot такой? их вроде 26 вариантов всего:

Код:
For $i = 1 To 25
    ConsoleWrite(_cipher_Rot(@SystemDir & '\calc.exe', $i, False) & @CRLF)
Next

ConsoleWrite(_cipher_Rot(@SystemDir & '\calc.exe', 47, False) & @CRLF)

;===================================================================================================
; Function Name....:    _cipher_Rot($s_data [, $iRotType = 13 [, $bDecode = False]])
; Description......:    cipher char rotation Rot:1-25, 47
; Parameter(s).....:
;                       $sData:      String to encode/decode
;                       $iRotType:  [Default = 13]; integer 1-18, 25, or 47
;                       $bDecode:   [Default = False]; For rot 1-4, 6-12, 14-17, 19-25 only
; Return Value(s)..:
;                       Success...:  Encoded or Decoded string
;                       Failure...:  Empty string
;                       Error.....:
;                                    1. Empty String
;                                    2. StringToASCIIArray() failed
;                                    3. Passed wrong type of $iRotType
; Requirement(s)...:    N/A
; Author(s)........:    SmOke_N (Ron Nielsen) [email protected]
; Modified.........:    N/A
; Comment(s).......:    Tested with AutoIt 3.3.6.1/3.3.12.0
; Example(s).......:    See example output in comment fields within the include file
;===================================================================================================
Func _cipher_Rot($sData, $iRotType = 13, $bDecode = True)
    If Not StringLen($sData) Then Return SetError(1, 0, "")
 
    Local $aStr = StringToASCIIArray($sData)
    If @error Then Return SetError(2, 0, "")
 
    $iRotType = Int($iRotType)
    Switch $iRotType
        Case 1 To 4, 6 To 12, 14 To 17, 19 To 25 ; alpha only
            For $idat = 0 To UBound($aStr) - 1
                If Not $bDecode Then
                    Switch $aStr[$idat]
                        Case 65 To 90
                            $aStr[$idat] += $iRotType
                            If $aStr[$idat] > 90 Then
                                $aStr[$idat] = ($aStr[$idat] - 90) + 64
                            EndIf
                        Case 97 To 122
                            $aStr[$idat] += $iRotType
                            If $aStr[$idat] > 122 Then
                                $aStr[$idat] = ($aStr[$idat] - 122) + 96
                            EndIf
                    EndSwitch
                Else
                    Switch $aStr[$idat]
                        Case 65 To 90
                            $aStr[$idat] -= $iRotType
                            If $aStr[$idat] < 65 Then
                                $aStr[$idat] = 91 - (65 - $aStr[$idat])
                            EndIf
                        Case 97 To 122
                            $aStr[$idat] -= $iRotType
                            If $aStr[$idat] < 97 Then
                                $aStr[$idat] = 123 - (97 - $aStr[$idat])
                            EndIf
                    EndSwitch
                EndIf
            Next
        Case 5 ;numbers only
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 48 To 52
                        $aStr[$idat] += 5
                    Case 53 To 57
                        $aStr[$idat] -= 5
                EndSwitch
            Next
        Case 13 ;alpha only
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 65 To 90
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 91 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                    Case 97 To 122
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 123 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndSwitch
            Next
        Case 18 ;alpha/numeric only
            $iRotType = 13
         
            For $idat = 0 To UBound($aStr) - 1
                Switch $aStr[$idat]
                    Case 48 To 52
                        $aStr[$idat] += 5
                    Case 53 To 57
                        $aStr[$idat] -= 5
                    Case 65 To 90
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 91 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                    Case 97 To 122
                        $aStr[$idat] = (($aStr[$idat] + $iRotType) < 123 ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndSwitch
            Next
        Case 47 ;all ascii chars
            For $idat = 0 To UBound($aStr) - 1
                If ($aStr[$idat] > 32 And $aStr[$idat] < 127) Then
                    $aStr[$idat] = (($aStr[$idat] + $iRotType < 127) ? $aStr[$idat] + $iRotType : $aStr[$idat] - $iRotType)
                EndIf
            Next
        Case Else
            Return SetError(3, 0, "")
    EndSwitch
 
    Return StringFromASCIIArray($aStr)
EndFunc ;==>_cipher_Rot
Спасибо, я ленивый минималист, мне больше всего подходит мой код, но ладно если нет так нет буду использовать другие варианты, я просмотрел много тем и ваших ответов и в большинстве вы даёте решение но в этом случаи наверное это не возможно, я тоже перепробовал уже кучу всего и имею лишь один вариант это шифровать поверх rot строку base или hex, но не в обиду вам я очень благодарен вам за варианты, возможно я в следующий раз обращусь с какой нибудь другой проблемой и вы найдёте её решение, спасибо что вы помогаете новичкам
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Кодировка самого файла скрипта какая?
 
Верх