Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 28, 2020 08:09:53

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

doza_and
Ну например авторы подумали что неплохо бы RLE сжатие применить.
Сжатие предполагает уменьшение длины входных данных, так ведь? В таком случае, это не вариант, потому что добавление букв пропорционально увеличивает длину выхода (добавление слова приводит к изменению сегмента на длину слова плюс 1 байт). Но я заметил интересную закономерность.
Вот последовательности, которые кодируют (помимо прочей информации) следующие числа и слова:
59:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa8\xb2\x8e\xb8\xc2'
77:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xaa\xb0\x8e\xb8\xc2'
99:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xac\xb2\x8e\xb8\xc2'
0000:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\x9a\xc4\xce'
1111:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa4\xaa\xb0\xb6\x9a\xc4\xce'
абвг:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITsSZah\x9a\xc4\xce'
00000000:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\xbb\xc1\xc7\xcd\xb2\xdc\xe6'
PythonSU:
 b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xc3\xf2\xf3\xed\xfa\xff\xea\xf2\xb2\xdc\xe6'
Как можно видеть, 59 - это b'\xa8\xb2', 77 - b'\xaa\xb0', 99 - b'\xac\xb2', абвг - b'SZah', PythonSU - b'\xc3\xf2\xf3\xed\xfa\xff\xea\xf2'. В конце сегмента при этом всегда остается 3 байта. Видите закономерность? Она в том, что эти 3 байта будут одинаковы, если длины слов на входе совпадают. Т.е., у слов с длиной в 2 символа конечные 3 байта всегда будут b'\x8e\xb8\xc2', в 4 символа - b'\x9a\xc4\xce', в 8 символов - b'\xb2\xdc\xe6'. Что это может значить?

Отредактировано vanvanov (Янв. 28, 2020 08:19:37)

Офлайн

#2 Янв. 28, 2020 20:43:02

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Заметил еще одну важную особенность.
1) Байты, кодирующие повторяющиеся символы, разные в пределах сегмента (т.е. в слове “палата” все буквы “а” будут кодироваться разными байтами: “палата” = b“bYje}q”).
2) Для разных сегментов повторяющиеся символы кодируются одинаково: “макака” = b“_Yieuq”, т.е. что в слове “палата”, что в слове “макака” 1-ое “а” - b“Y”, 2-ое “а” - b“e”, 3-е “а” - b“q”.
3) Правило №2 выполняется только в том случае, если повторяющиеся символы находятся на одинаковом расстоянии друг от друга, например, каждая 2-я буква и т.п. Сравните, например: “сарафан” = b“dYoe\x7fq\x84”, последовательность “а”: b“Yeq” и “сараффан” = b“dYoe\x7f\x85w\x8a”, последовательность “а”: b“Yew”.
Из всего этого следует, что одинаковые символы кодируются одинаково, однако, только в одинаковых позициях, т.е. кодировка меняется в зависимости от позиции символов. Кто-нибудь может подсказать кодировки (алгоритмы кодирования), где байты зависят от своих позиций?

Офлайн

#3 Янв. 30, 2020 05:02:40

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

например XOR

 >>> s =  'qwerty qwerty'
>>> k = '1234'
>>> ln = len(k)
>>> for i in range(len(s)):
    j = i % ln
    out.append(chr(ord(s[i]) ^ ord(k[j])))
    
>>> out
['@', 'E', 'V', 'F', 'E', 'K', '\x13', 'E', 'F', 'W', 'A', '@', 'H']
>>> for i in range(len(s)):
    j = i % ln
    t = ord(out[i]) ^ ord(k[j])
    out[i] = chr(t)
    
>>> out
['q', 'w', 'e', 'r', 't', 'y', ' ', 'q', 'w', 'e', 'r', 't', 'y']
>>> 

Отредактировано vic57 (Янв. 30, 2020 05:05:44)

Офлайн

#4 Янв. 30, 2020 15:43:35

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vic57
Спасибо за ответ. А как можно сделать обратный XOR при кодировке cp1251? ord и chr теперь работают только с юникодом. В частности, не могу понять, как по int вычислить байты и букву. Предположим, что смещение идет на 6 символов вперед. Пытаюсь зашифровать, чтобы проверить свою гипотезу:

 >>> p = bytes('палата','windows-1251')
>>> p
b'\xef\xe0\xeb\xe0\xf2\xe0'
>>> ints = [pos+6 for pos in p]
>>> ints
[245, 230, 241, 230, 248, 230]
И как мне получить байты для cp1251? Простите, если туплю.

Офлайн

#5 Янв. 30, 2020 15:52:01

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Ну как бы…

 >>> dd=b'\xa5\xa9\xb1\xb5'
>>> list(map(lambda x, n: chr(x-115 - n*6), dd, range(len(dd))))
['2', '0', '2', '0']
>>> dd = b'\xa8\xb2'
>>> list(map(lambda x, n: chr(x-115 - n*6), dd, range(len(dd))))
['5', '9']
>>> dd = b'\xaa\xb0'
>>> list(map(lambda x, n: chr(x-115 - n*6), dd, range(len(dd))))
['7', '7']
С палатой будет сложнее ибо вряд ли там будет юникод…



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Янв. 30, 2020 15:57:02)

Офлайн

#6 Янв. 30, 2020 16:00:52

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Rodegast
Спасибо!

Rodegast
С палатой будет сложнее ибо вряд ли там будет юникод…
Да, там windows-1251. Сейчас пытаюсь понять, что надо использовать для этой кодировки для смещения и обратно.

Отредактировано vanvanov (Янв. 30, 2020 16:02:58)

Офлайн

#7 Янв. 30, 2020 16:09:43

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

C этим всё просто….

 >>> dd=b'\xef\xe0\xeb\xe0\xf2\xe0'
>>> dd.decode("cp1251")
'палата'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Янв. 30, 2020 16:56:26)

Офлайн

#8 Янв. 30, 2020 16:33:15

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

vanvanov
И как мне получить байты для cp1251? Простите, если туплю.
 >>> s = 'палата'
>>> a = s.encode('cp1251')
>>> a
b'\xef\xe0\xeb\xe0\xf2\xe0'
>>> b = bytes([ i+3 for i in a])
>>> b
b'\xf2\xe3\xee\xe3\xf5\xe3'
>>> b.decode('cp1251')
'тгогхг'
>>> bytes([i - 3 for i in b]).decode('cp1251')
'палата'

Офлайн

#9 Фев. 24, 2020 17:21:57

justicek
Зарегистрирован: 2020-02-19
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

спасибо за информацию))

Офлайн

#10 Апрель 8, 2020 02:25:25

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск в двоичных файлах

Спасибо всем за помощь. Я смог декодировать то, что было нужно. Но есть небольшая проблема. Я взялся за новую версию, и там уже другой алгоритм XOR. Опять без компрессии, байт-в-байт, кодировка cp1251. Например, вот что будет, если добавить в комментарий нули (3 кавычки добавлены, чтобы не экранировать при необходимости):

 "0000000000"
b'''\x18\x9f\xf0!\xec\xa0}\xefxq'''
NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "0"   48    24    -24     -24  
2   "0"   48    159   111     135  
3   "0"   48    240   192     81   
4   "0"   48    33    -15     -207 
5   "0"   48    236   188     203  
6   "0"   48    160   112     -76  
7   "0"   48    125   77      -35  
8   "0"   48    239   191     114  
9   "0"   48    120   72      -119 
10  "0"   48    113   65      -7   
INT1 обозначает позицию кодируемого символа (“0”) в кодировке cp1251, INT2 - финальную позицию, OFFSET - смещение, DELTA - разницу между смещениями.

Заметил следующие особенности.

1) Кодирование зависит от длины фрагмента. Один и тот же символ будет закодирован по-разному в зависимости от длины фрагмента.

2) Если фрагменты одинаковой длины и отличаются, например, только конечные байты, то начальные байты будут одинаковы.

3) Обнаружил алгоритм для кодирования разных байтов, стоящих на одинаковых позициях (например, b“abc” -> b“abd”). За редким исключением, там зациклено смещение -2, -2, -2, +6, -2, -2, +10 для всей кодировки cp1251. Проблема в том, что мне надо знать, как меняются байты на разных позициях, т.е., не b“abc” -> b“abd”, а, например, от чего зависит смещение b“d” в b“abcd”, если смещение a, b и c известно.

Например:

 "bbbbbb"
b'''`\xbe\xe4\x81\x19\x97'''
NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "b"   98    96    -2      -2   
2   "b"   98    190   92      94   
3   "b"   98    228   130     38   
4   "b"   98    129   31      -99  
5   "b"   98    25    -73     -104 
6   "b"   98    151   53      126  
"bbcbbb"
b'''`\xbe\xfb\x81\x19\x97'''
NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "b"   98    96    -2      -2   
2   "b"   98    190   92      94   
3   "c"   99    251   152     60   
4   "b"   98    129   31      -121 
5   "b"   98    25    -73     -104 
6   "b"   98    151   53      126  
"abc"
b'''JD%'''
NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "a"   97    74    -23     -23  
2   "b"   98    68    -30     -7   
3   "c"   99    37    -62     -32  
"abcdef"
b'''a\xbeB\xd1f\xb1'''
NO  ORIG  INT1  INT2  OFFSET  DELTA
1   "a"   97    97    0       0    
2   "b"   98    190   92      92   
3   "c"   99    66    -33     -125 
4   "d"   100   209   109     142  
5   "e"   101   102   1       -108 
6   "f"   102   177   75      74   
Какой алгоритм используется? Извините, если туплю, но у меня небольшой опыт работы с бинарниками, а в шифровании вообще не разбираюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version