Однажды в свободную минутку своего рабочего времени я решил слить конфиги рабочего и домашнего FAR'ов. Открыв в WinMerge оба FarSettings.User.reg, вяло покручивая колёсико мышки, внезапно я зацепился взглядом за знакомые ftp-адреса своих учётных записей на всяких серверах. Увидев их на экране казённого компьютера, я почувствовал себя очень неуютно. И решил разобраться, насколько надёжно FTP-плагин от FAR'а хранит мои пароли.
- Создаю учётную запись, называю хост редким словом, чтоб потом было проще искать в реестре (именно там FAR хранит все настройки). В моём случае этим словом почему-то стало gremlin.
Ставлю пароль — восемь единичек. Мне так удобнее, у них код ascii — 0x31 (я дальше «0x» буду опускать).
- Открываю regedit, запускаю поиск по слову gremlin, нахожу.
- Вижу в поле Password свои восемь единичек (теперь они — 67). Нолик после них говорит нам о том, что данные хранятся строкой (нолик — конец строки). И эти данные закодированы. Первые два байта непонятны.
- Открываю в FAR'е диалог редактирования параметров учётной записи FTP, ничего не меняю, сохраняю. Поменялись первые два байта, и байт, заместивший «единичку».
- Ставлю пароль «1234», сохраняю. Закодированная последовательность принимает вид: «89 b2 4a 49 48 4f 00 …» Монотонность байтов пароля не сохранилась, значит, кодирование выполнено не сложением-вычитанием побайтово с какой-то константой, а…
…да. Им. Xor'ом. Исключающим ИЛИ. Сложением по модулю два. Самой таинственной операцией всех времён и народов. Супералгоритм пробегает по паролю одним байтом, ксорит их и… и всё. - Набираю статистику, попутно с нервным хихиканьем ксоря между собой первые два таинственных байта.
b0^b1 => xorbyte 0d 5d 0e 5e 18 58 30 70 33 73 3b 7b 3f 7f 49 59 53 53 57 57 58 58 69 79 7c 7c
Младший полубайт копируется, старший… короче, xorbyte=((b0^b1)&0x2f)|0x50.
Занавес, одинокие аплодисменты в темноте.
P.S. Программа под Windows и исходнички под VisualC.
Автор: nimblebots