Взлом коротких паролей: начало (29.04.2025). |
![]() |
2025 - Апрель | |
29.04.2025 18:55 | |
Как бы не стало как с токоограничителем из Arduino из-за какой-нибудь мелочи (провал - куча потерянного времени: раз, два, три); но результаты пока получились и предсказуемые, и прям наглядные. Особенно наглядно для людей, которые любят в качестве пароля ставить 6-значный ДР ребёнка (и это не блондинки-секретарши - берите гораздо выше, на уровни боссов; и не просто боссов, а боссов-технарей). Неспешный гуглёж выдал, что пароли, в большинстве случаев, шифруются с помощью хеширования - вопрос лишь в алгоритме: MD5, SHA и т.д. Набросал исходники (в конце материала - для ознакомления), перебирающие целочисленные пароли с помощью MD5, - с оговорками. Максимальная длина пароля и сам пароль известны изначально, и отсутствует задержка ответа объекта взлома - но и исходник не шибко оптимизированный, и среда программирования днище полное, и ОС какашечка, и режим дебага вместо релиза, и однопоточность. Измерил скорость ядра в turbo-режиме с помощью HWiNFO: 4.25ГГц средняя у Intel i5-10400. Использовался класс QDateTime для отличия времени, затраченного на перекомпиляцию программы, от времени отгадывания пароля. Скорость взлома 6-значного пароля - менее секунды, одним-единственным ядром. И неважно, с какой цифры будет начинаться: разница во времени ничтожна: 123456 - 0.11с, 999999 - 0.56с (нелинейная скорость перебора паролей за единицу времени). При прибавлении каждого нового символа - линейно увеличивается время отгадывания: 7 девяток - 5.58с, 8 - 57.76с, 9 - 572с (а дальше - уже близко к переполнению uint). При работе с 9-ю девятками - ОС сама решает, внезапно, перебросить нагрузку на другой поток - бесит, несколько раз. Осталось разделить на 12 потоков CPU - и получить ещё более кислый теоретический результат на всём CPU по коротким численным паролям, при использовании многопоточности. #include "QCryptographicHash" #include "qdatetime.h" QCryptographicHash qchEncryptor(QCryptographicHash::Md5); //Может разными методами: SHA256 и т.д. const QString qsPassword_Needed = "130385"; //ДР сыночки, ути-пути. const QByteArray qbaPassword_Needed = qchEncryptor.hash(QByteArray::fromStdString(qsPassword_Needed.toStdString()), QCryptographicHash::Md5); QByteArray qbaPassword; QString qsPassword = ""; unsigned int uiResult = 0; quint64 qui64Begin = QDateTime::currentMSecsSinceEpoch(); for (uiResult=0; uiResult<=999999999; uiResult++) { qsPassword = QString::number(uiResult); while (qsPassword.length() < qsPassword_Needed.length()+1) //9, 09, 009, 0009 и т.д. { qbaPassword = qchEncryptor.hash(QByteArray::fromStdString(qsPassword.toStdString()), QCryptographicHash::Md5); if (qstrcmp(qbaPassword, qbaPassword_Needed) == 0) goto End; //Если кто-нибудь упрекнёт в использовании goto - $~#@*()(%^^%#^%^! qsPassword= "0" + qsPassword; } } End: quint64 qui64End = QDateTime::currentMSecsSinceEpoch(); float fTime_Work = (qui64End-qui64Begin)/1000.0; int iStop_Here = 0; |
|
Обновлено ( 29.04.2025 21:14 ) |