Есть вот такой алгоритм шифрования файлов через XOR: Код (Text): password = '123412341234' + password; hash = MD4(password); for (pos = 0; pos < 134; pos++) data[pos] ^= hash[pos % 16]; Размер файла 134 байта. В середине файла есть 2 байта, которые одинаковы у всех исходных файлов. Вопрос: Можно ли расшифровать файл без пароля или получить пароль? Под паролем подразумеваю MD4 хэш, с помощью которого зашифрован файл. Его длина известна - 16 байт, символы из которых он состоит - тоже (цифры от 0 до 255).
MD4 - алгоритм хэширования. И в данном случае используется для получения ключа шифрования XOR - MD4(строка-константа + пароль). Именно про этот ключ я и спрашиваю.
Ты про Advapi32!MD4# и MD5? Вот кусок кода MD4: Код (Text): Esi=[CTX+8] Edx=[CTX+4] Edi=[CTX+0Ch] Ecx=Ptr_String .............................................................................. Ebx=((((Edi xor Esi) and Edx) xor Edi)+D[ecx]+D[CTX]) rol 3 .............................................................................. Edi=(Edi+(((Esi xor Edx) and Ebx) xor Esi)+D[ecx+4]) rol 7 .............................................................................. Esi=(Esi+(((Edx xor Ebx) and Edi) xor Edx)+D[ecx+8]) rol 0Bh .............................................................................. Edx=(Edx+(((Edi xor Ebx) and Esi) xor Ebx)+D[ecx+0Ch]) rol 13h .............................................................................. Ebx=(Ebx+(((Edi xor Esi) and Edx) xor Edi)+D[ecx+10h]) rol 3 .............................................................................. Edi=(Edi+(((Esi xor Edx) and Ebx) xor Esi)+D[ecx+14h]) rol 7 .............................................................................. Esi=(Esi+(((Edx xor Ebx) and Edi) xor Edx)+D[ecx+18h]) rol 0Bh .............................................................................. Edx=(Edx+(((Edi xor Ebx) and Esi) xor Ebx)+D[ecx+1Ch]) rol 13h .............................................................................. Ebx=(Ebx+(((Edi xor Esi) and Edx) xor Edi)+D[ecx+20h]) rol 3h .............................................................................. Edi=(Edi+(((Esi xor Edx) and Ebx) xor Esi)+D[ecx+24h]) rol 7h .............................................................................. Esi=(Esi+(((Edx xor Ebx) and Edi) xor Edx)+D[ecx+28h]) rol 0Bh .............................................................................. Edx=(Edx+(((Edi xor Ebx) and Esi) xor Ebx)+D[ecx+2Ch]) rol 13h .............................................................................. Ebx=(Ebx+(((Edi xor Esi) and Edx) xor Edi)+D[ecx+30h]) rol 3h .............................................................................. Edi=(Edi+(((Esi xor Edx) and Ebx) xor Esi)+D[ecx+34h]) rol 7h .............................................................................. Esi=(Esi+(((Edx xor Ebx) and Edi) xor Edx)+D[ecx+38h]) rol 0Bh .............................................................................. Edx=(Edx+(((Edi xor Ebx) and Ebx) xor Edx)+D[ecx+3Ch]) rol 13h Eax=((Esi or Edx) and Edi)) or (Esi and Edx) .............................................................................. Ebx=(Ebx+(Eax+D[ecx]+5A827999h)) rol 3 Eax=((Edx or Ebx) and Esi) or (Edx and Ebx) .............................................................................. Видно, что из хэша пароль не выделишь. В твоём случае непонятно что за MD4().
Да причем тут MD4! Я про XOR спрашиваю. Исходный файл (134 байта) ксорится ключем (16 байт). Т.е. первый байт файла - первым байтом ключа, 2ой - 2ым, 16ый - 16ым, 17ый - 1ым, и так далее... При этом: 1) ключ - MD4 хэш. 2) во всех исходных файлах есть 2 одинаковых байта на одном и том-же месте. Меня интересует, воззможно ли расшифровать файл не зная этого хэша или получить этот хэш.
Если ты знаешь эти 2 байта, то ты знаешь 2 байта ключа и можешь расшифровать 1/8 каждого файла. Если ты знаешь содержимое хотя бы одного зашифрованного файла то ты сможешь расшифровать все файлы зашифрованные на данном пароле. Что внутри файлов-то?
Содержимое каждого файла (открытый ключ rsa под xor'ом) уникально. Я хочу узнать, возможно ли подобрать пароль по 1му символу или расшифровать файл не зная пароль. XOR 128 bit не поддается криптоанализу?
Интересно, а зачем шифровать открытые ключи? =) И что это за ключи такие что у них у всех 2 байта одинаковые =) Нет, по одному символу файл расшифровать нельзя. 128 битный XOR не то чтобы криптоанализу не поддается, его-то и алгоритмом шифрования назвать можно с боольшой натяжкой, просто у тебя условия жесткие. А как эта система реагирует на неправильный пароль? Есть там алгоритм проверки?
Это у нашего местного разработчика спросить надо, зачем открытый ключ для подписи дополнительно шифровать. При авторизации клиента спрашивает пароль, которым расшифровывается ключ. Из за глупости разработчика. У него формат файла: [MD4 файла]\x00[длина e]\x00[e)][длина n]\x00[n]. И при шифровании файла получается, что заголовок "[MD4 файла]\x00[длина e]\x00" остается без изменений, а "[e][длина n]\x00[n]" шифруется. При этом [длина n]==[длина e]==\x42 Ага, гаммированием вроде это называется... Как уже написал выше, в заголовке есть MD4 исходного файла. При вводе логина и пароля, они соединяются в одну строку. От них получается MD4 хэш, которым ксорится файл. После этого сравниваются MD4 того, что получилось, и MD4 из заголовка. Если они совпадают, то получившимся открытым ключем RSA подписывается строка авторизации, которая отправляется на сервер для проверки. На сервере эта строка расшифровывается закрытым ключем и сравнивается с тем, что было отправлено клиенту. Если они совпадают, то клиент авторизован.
Client authorizuyetsa po znaniyu otkritogo klucha servera??? Yego zhe vse clienti znayut! Naoborot navernoye vsio - eto navernoye *zakritiy* kliuch na cliente shifruyetsa parolem, a na servere kak raz otkritiy kliuch etogo clienta. Vsio ravno prosto XOR s MD4 hash ot parolia? Da po etim neskolkim izvestnim bytes znayete kak legko rainbow tables stroit i paroli nahodit? Tupo kak-to... Takiye algoritmi, a vmesto shifrovaniya XOR...
chatty2 Если из содержимого файла больше ничего не известно — то расшифровать не получится. Если будешь знать n или e, то расшифровывается все тривиально. Если пароль вводит пользователь, то можно попробовать поподбирать его брутфорсом/словарем. P.S> Вооще странный формат ключа: модуль 528 бит и e 528 бит. Такой модуль разламывается без особых трудностей, а с таким e шифрование будет происходить очень медленно.
Как вариант - взять словарь, просчитать для каждого пароля MD4('123412341234' + password), сохранять для 2го этапа только те хэши, в которых совпали 2 известных байта. Затем уже на 2м этапе производить честную расшифровку и сравнивать хэш от расшифрованного файла с эталонным. з.ы. Ещё 2 бита хэша нам потенциально известны, если учесть что самый старший бит E равен 1 и самый младший тоже должен быть 1 (E - нечётное число, если не ошибаюсь). Аналогично 2 бита можно вытащить и из N, если ничего не путаю. Так что маску отсева потенциальных хэшей на 1м этапе можно расширить на эти биты.
Это сделал - скорость подбора возрасла в 4 раза. А вот с битами E и N не понятно. Вот E и N из моего расшифрованного файла: E: Код (Text): AD2627D4BE0AF2564857B71DE2F2AD75D60DA75E350D79899EE68186FDB3EB0C8B7B0AF38C0F1B64754F19DE4B2890F75AE33D16F63B673DAE3E04D4F34944BCC702 N: Код (Text): D5D9D4CDCBACF72A3C037CFEA6D7E2BA11AA317A7E847F28CCDF39D2B8C33642BCCA441B537EE393E22B790DEE06B6B5FE8883A4E9026E4F0449A0EFB867957EE806
Читаем описание алгоритма RSA: Взять два больших простых числа p и q. //p и q нечётны, ибо просты Вычислить n = pq. // n - нечётно, ибо p и q нечётны. Взять небольшое нечетное число e, взаимно простое с φ(n) = (p−1)(q−1). // e - нечётно по алгоритму Вычислить d = e−1 (mod φ(n)). Пара P = (e, n) — открытый RSA-ключ. Пара S = (d, n) — секретный RSA-ключ. Таким образом, в расшифрованном виде последний байт E и последний байт N будут иметь вид (битовое представление): ???????1. Произведём XOR с тем последним байтом, что имеется на практике: для E: 00000010 XOR ???????1 = ???????1, значит соответсвующий байт в хэше (ключе) (вычислить каким байтом хэша расшифровывается последний байт E) должен быть нечётным. Аналогично для N: 00000110 XOR ???????1 = ???????1, значит соответсвующий байт хэша тоже должен быть нечётным. Таким образом ещё сокращаем число хэшей, годных для второго этапа в 4 раза, отсеивая те, в которых данные байты будут чётными. Насчёт старших единичных битов я походу погорячился, по крайней мере в случае E.
Выяснилось, что RSA все-таки там не используется. Есть всего 1 ключ, в нем E и N. Он находится как на сервере, так и у клиента. С помощью "модульного возведения в степень" (Modular Exponentiation), вычисляется хэш некоторой строки. Он отправляется на сервер, где имеющимся ключем этого клиента вычисляется хэш от этой-же строки. После этого хэши сравниваются. Кто что может сказать про это возведение? Есть ли какие-то условия для E/N, которые можно использовать? E и N, которые я писал выше, уже расшифрованы. И они как я понимаю - четные. При этом, из того, что я нашел про ModExp, видно, что E/N должны быть такие-же как и в RSA.
Практически. В файле числа E и N, используемые для хэширования. Всего 134 байта, из них всегда известно 2.