Форум сайта python.su
doza_andСжатие предполагает уменьшение длины входных данных, так ведь? В таком случае, это не вариант, потому что добавление букв пропорционально увеличивает длину выхода (добавление слова приводит к изменению сегмента на длину слова плюс 1 байт). Но я заметил интересную закономерность.
Ну например авторы подумали что неплохо бы RLE сжатие применить.
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa8\xb2\x8e\xb8\xc2'
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xaa\xb0\x8e\xb8\xc2'
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xac\xb2\x8e\xb8\xc2'
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\x9a\xc4\xce'
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'
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xa3\xa9\xaf\xb5\xbb\xc1\xc7\xcd\xb2\xdc\xe6'
b'\xfcqo\x7fx\x87\x8e\x98\x94\x9f93(946KITs\xc3\xf2\xf3\xed\xfa\xff\xea\xf2\xb2\xdc\xe6'
Отредактировано vanvanov (Янв. 28, 2020 08:19:37)
Офлайн
Заметил еще одну важную особенность.
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”.
Из всего этого следует, что одинаковые символы кодируются одинаково, однако, только в одинаковых позициях, т.е. кодировка меняется в зависимости от позиции символов. Кто-нибудь может подсказать кодировки (алгоритмы кодирования), где байты зависят от своих позиций?
Офлайн
например 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)
Офлайн
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]
Офлайн
Ну как бы…
>>> 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)
Офлайн
Rodegast
Спасибо!
RodegastДа, там windows-1251. Сейчас пытаюсь понять, что надо использовать для этой кодировки для смещения и обратно.
С палатой будет сложнее ибо вряд ли там будет юникод…
Отредактировано vanvanov (Янв. 30, 2020 16:02:58)
Офлайн
C этим всё просто….
>>> dd=b'\xef\xe0\xeb\xe0\xf2\xe0' >>> dd.decode("cp1251") 'палата'
Отредактировано Rodegast (Янв. 30, 2020 16:56:26)
Офлайн
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') 'палата'
Офлайн
спасибо за информацию))
Офлайн
Спасибо всем за помощь. Я смог декодировать то, что было нужно. Но есть небольшая проблема. Я взялся за новую версию, и там уже другой алгоритм 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
"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
Офлайн