eXeL@B —› Основной форум —› Вопрос по CryptoAPI |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 20 августа 2013 21:05 · Поправил: ARCHANGEL · Личное сообщение · #1 Добрый вечер, уважаемые. Ковыряю одну программку, всё мне, в общих чертах, с ней понятно. Но есть один интересный момент. Попробую его подробно описать. Дело в том, что программка эта использует CryptoAPI в ходе проверки регистрационного ключа. Если описывать процесс подробно, то всё обстоит примерно так. Вначале программа вычисляет hwid по параметру даты биоса из реестра и GetVolumeInformation, это неважно. Далее эти параметры она, типа, хэширует по какому-то самопальному алгоритму, тоже неважно. Потом начинается самое интересное. Вначале создаётся объект для работы с md5 хэшем: Code:
Потом, естественно, идёт вычисление хэша md5 от слабого (самопального) хэша. Code:
Далее, как я понимаю, на основе md5-хэша по алгоритму rc2 создаётся сессионный ключ: Code:
Теперь вспомним про то, что мы ведь тоже ввели какой-то серийник, который, собственно и проверяется в ходе регистрации. Так вот, в ходе проверки из этого серийника всегда получается массив длиной в восемь байт. Всегда! Алгоритм проверки реализован без косяков, т.е. на вычиисление длины не влияет, есть ли внутри массива нулевые байты или нет - всё работает, как часы. Ок, идём дальше. Сейчас у нас есть сессионный ключ, и есть 8-ми байтовый массив. Далее происходит расшифровка массива по сессионному ключу: Code:
И вот здесь - самое вкусное. Расшифровка-то происходит (на месте старых 8-ми байт появляются новые значения), но вот функция CryptDecrypt возвращает FALSE, GetLastError() возвращает NTE_BAD_DATA. Я тут гуглил-гуглил, и нагуглил The typical reason why CryptDecrypt would fail with NTE_BAD_DATA would be that you're decrypting the last block of a block cypher (as you are) and the decrypted padding bytes are incorrect. This can happen if the input is truncated (not all encrypted bytes were saved to the file) or if the key is incorrect. В общем, если то, что написано, правда, то тут ситуация ясна - key is incorrect стопудово, т.к. откуда ж мне знать его правильный. В связи с этим возникает несколько вопросов. 1. Правда ли, что при неправльном сессионном ключе может возникать такая ошибка? (А то я просто думал, что если ключ для алгоритма расшифровки неверный, то просто будут данные некорректные, но в ходе расшифровки это никак не спалить, это ж не цифровая подпись) 2. Если правда, то как выполнить атаку, чтоб найти правильный? Спасибо всем, кто осилил сей пост до конца и проникся моими проблемами. Саму программу я не прикладываю, ибо большая, узкоспециализированная и никому сама по себе неинтересна. Примечание int, я надеюсь, что снятся тебе каждую ночь. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 21 августа 2013 14:34 · Поправил: ajax · Личное сообщение · #2 |
|
Создано: 21 августа 2013 14:37 · Поправил: r_e · Личное сообщение · #3 Это не гон, это соль называется (salt). Для предотвращения определенного типа атак в голову дописывается рандомный блок данных фиксированной длины. Во время декрипта он просто обрезается. Он может быть и переменной длины - тут все решает реализация. ----- старый пень | Сообщение посчитали полезным: ajax |
|
Создано: 21 августа 2013 14:40 · Личное сообщение · #4 |
|
Создано: 21 августа 2013 14:43 · Личное сообщение · #5 |
|
Создано: 17 сентября 2013 17:20 · Личное сообщение · #6 Возник вопрос, связанный с криптографией, решил не плодить темы - спросить здесь. В общем, есть у меня программа, она использует AES в своей рег. схеме. Вначале она создаёт буфер длиной 16 байт, заполняет его нулями. Потом выполняется, как я понял, Encription, и в буфере появляются байтики: Code:
Я стал читать описание алгоритма, и столкнулся с несколькими непонятными мне моментами. Вначале я нашёл реализацию на паскале (!): Потом стал искать классы в дотнете, и нашёл ссылку: В дотнете упоминается так называемый "вектор инициализации", который В паскалевой реализации я его найти не смог. Потом прочитал статью на хабре: ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 17 сентября 2013 17:25 · Поправил: reversecode · Личное сообщение · #7 |
|
Создано: 17 сентября 2013 17:42 · Личное сообщение · #8 reversecode Сейчас осмотрел паскалевый исходник на предмет наличия InitVector, и получается, что он используется только при поточном шифровании/дешифровке, и при блочном - не используется. Code:
Т.е. получается, что я неправильно выразился. У меня в программке тупо шифруется блок. Но риппать код не хочется, есть ли в С# блочное шифрование, аналогичное паскалевому? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 17 сентября 2013 17:50 · Поправил: reversecode · Личное сообщение · #9 |
|
Создано: 17 сентября 2013 18:21 · Поправил: ARCHANGEL · Личное сообщение · #10 Форум не даёт длинные аттачи делать (( Ладно, выделим главное: Code:
Это в коде моей прожки подопытной. В паскале вообще вот так: Code:
На последнем раунде Key[51] используется, это что получается - там 148h байт в ключе? Как так? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 17 сентября 2013 18:27 · Поправил: reversecode · Личное сообщение · #11 |
|
Создано: 17 сентября 2013 18:47 · Личное сообщение · #12 reversecode В общем, ещё раз. Есть прожка, в ней есть алго, я его анализировал и пришёл к выводу, что это - AES. В прожке юзаются ForwardTable и LastForwardTable, точно такие же, как и в паскалевом исходнике. Собственно, по ним я исходник и нашёл. Мне для кейгена нужно воспроизвести такой же процесс шифрования, точно такой же. На хочу не рипать асм-код и не кодить кейген на С++, а взять шарп. В ольке при трейсинге подсвечивается изменение буфера при его шифровании, т.е. был пустой буфер (16 байт забитые нулями), после шифрования получилось значение, которое я выше уже приводил: Code:
Отсюда я делаю вывод, что реализация работает с блоками 16 байт, т.е. 128 бит. Никаких других таблиц, кроме ForwardTable и LastForwardTable, я не видел. Значит не юзается никакой вектор инициализации. Паддинга тоже нет - тупо взяли блок в 16 байт и шифранули. Вот я и хочу понять, каким способом. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 17 сентября 2013 18:54 · Поправил: reversecode · Личное сообщение · #13 if ( *(_DWORD *)(a1 + 16) > 6u ) брякнись сюда и посмотри длинну ключа, с раундов переведешь в длинну, это будет надежней что бы определить какой алго юзается а то малоли что там в буффере и да, последний писк моды это каждый юзвер патчит свой AES )) так что малоли, снимай дампы смотри вход выход на одном блоке, и сравнивай у себя а еще лучше на чем то стандартном, онлайн AES декрипто-крипторов много | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 17 сентября 2013 22:30 · Личное сообщение · #14 |
|
Создано: 17 сентября 2013 22:50 · Личное сообщение · #15 |
|
Создано: 18 сентября 2013 00:17 · Личное сообщение · #16 |
|
Создано: 18 сентября 2013 00:32 · Личное сообщение · #17 очень похоже на aes256, для надежности лучше конечно вручную проверять количество блоков, а то малоли какая там реализация aes а для проверки в онлан, вбей ключ и входной блок и сравни как расшифрует с твоим если правильно, значит угадал ну либо наоборот, брякаешься на входе в свой aes, и в ольке забиваешь ключ и блок, и отпускаешь ольку до возврата, ну и опять же сравниваешь |
|
Создано: 18 сентября 2013 00:48 · Личное сообщение · #18 |
|
Создано: 18 сентября 2013 00:51 · Поправил: reversecode · Личное сообщение · #19 |
|
Создано: 18 сентября 2013 00:58 · Личное сообщение · #20 |
|
Создано: 18 сентября 2013 17:11 · Личное сообщение · #21 Вот это подходит для меня, буду использовать. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 02 октября 2013 13:55 · Поправил: ARCHANGEL · Личное сообщение · #22 Тяжёлые будни криптографии опять наступили для меня. В этот раз читаю теорию, вот, всё хорошо и интересно, но есть одна непонятная вещь. Читаю я разную литературу, и в ней упоминается несколько разных операций - вычитание по модулю, умножение по модулю. Наряду с этим есть просто вычисление по модулю, в гугле нашёл ещё и ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 02 октября 2013 14:09 · Поправил: r_e · Личное сообщение · #23 Если на пальцах, то вычисление по модулю - это общее название операций для которых характерно A mod N = X, until X < N, X -= N; A, N, X принадлежат заданному полю. Соответственно, остальные операции определяются классически с учетом правила выше. Например: Вычитание. A - B mod N = X, if X < 0 X += N, в поле натуральных с нулем. Квадратный корень: sqrt(A) mod N = X, такое что X^2 mod N = A. ----- старый пень | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 02 октября 2013 14:32 · Личное сообщение · #24 |
|
Создано: 02 октября 2013 14:54 · Личное сообщение · #25 |
<< . 1 . 2 . |
eXeL@B —› Основной форум —› Вопрос по CryptoAPI |