Replymessage unavailable
خیلی وقت پیش توی یک گروه دیگه معرفیش کرده بود ولی اینجا یک طور دیگه میگم. این کتابخانه از 3 کلاس مهم تشکیل شده، و نمونه multi-thread هر کدوم یک پسوند Worker داره.
فقط توجه کنید اینجا نمیگیم رمز ها از چند کاراکتر تشکیل شدن! میگیم از چند خونه تشکیل شدن!
میتونید، موقعیت شروع، پایان، حداقل طول حداکثر طول طول هایی که نباید در نظر گرفته بشن، حالت هایی که رمز رو تشکیل میدن رو تعیین کنید.
1️⃣کلاس SimpleBrute
این کلاس ساده ترینه، یعنی میتونید حالت های تشکیل دهنده رمز رو به صورت یک آرایه از object ها تعیین کنید. با استفاده از ترکیبات حالت ها برای هر اندازه مجاز، رمز هارو بهتون تحویل میده و میتونید استفاده کنید.
مثلاً بگید "drag,123,54" حالت ها هستن، و حداقل طول 4 خونه اس و حداکثر 8 خونه ولی مطئنیم که 6 و 7 نیست.
2️⃣کلاس PermutationBrute
این کلاس سریع ترین، و چالشی ترین کلاسی بود که پیاده سازیش کردم، چالش هم این بود نمیشد به راحتی گفت برای حالت های X,Y,Z,T موقعیت 3 چه ترکیبی داریم؟ الگوریتم back-tracking بود، ولی قابل پیشبینی نبود برام، یعنی الگویی ندیدم توش. اما، با الگوریتم جایگشت بعدی آشنا شدم. یک برنامه نویسی توی وبلاگ شخیش توضیحش داده بود. ولی توی این حالت extraPassLen رو اضافه نکردم:
public PermutationBrute(long startPos, long endPos, int minPassLen, int maxPassLen,
object[] test, int threadID = -1);
3️⃣ خفن ترین از نظر من، کلاس ProBrute
این کلاس باعث شده که بگم این چیزی که نوشتم واقعاً منعطفه! بخوام خلاصه بگم، میتونید توسط این کلاس برای هر خونه حالت های اون خونه رو تعیین کنید. مثلاً خونه اول: 1,2,3 خونه دوم: t1,23,f و...
اماااا.... توی این حالت کمترین و بیشتر تعداد خونه هم موجوده، ولی چطوری میشه گفت هر خونه چه حالت هایی داشته باشه؟
این یک مسئله ای بود که راه حلش همون لحظه که بهش فکر کردم اومد تو سرم، ولی کدش دیر تر اومد. با خودم گفتم به جای دادن index مطلق، فاصله از ابتدا یا انتهارو مشخص کنم. یعنی مثلاً خونه یکی مونده به آخر 1,2,3 و خونه سوم همیشه 5 باشه.
اگه برای مثال بالا حالتی بود که مثلاً کمترین اندازه 2 بود چی؟
توی این حالت خونه یکی مونده به آخر در حقیقت همون خونه اوله که حالاتش 1,2,3 هستش ولی خونه آخر چی؟ برای این حالت علاوه بر PassTestInfo ها یک آرایه از حالت های کلی هم باید به کلاس بدید تا اگه نتونست از طریق PassTestInfo ها به نتیجه ای برسه، از این حالات استفاده کنه.
public ProBrute(long startPos, long endPos, int minPassLen, int maxPassLen,
object[] test, PassTestInfo[]? testInfos = null, int[]? extraPassLengths = null,
int threadID = -1);
اینجا هم درمورد PassTestInfo گفتم:
/// <summary>
/// Constructor of the PassTestInfo class
/// </summary>
/// <param name="position">
/// The position of an element in the password can be specified from the beginning or the end.
/// Use numbers greater than or equal to 0 for distance from the beginning and use numbers less than 0 for distance from the end.
/// Think of it as writing code in Python :)
/// The length of the password is not a concern, as Cbrute automatically detects what needs to be done.
/// </param>
/// <param name="testList">The set of states considered for position "<paramref name="position"/>" in the password</param>
public PassTestInfo(int position, object[] testList);
در کل خواستم یک توضیح کلی بدم و اینکه این دومین و چالشی ترین پروژهی خودم بود، گفتم به اشتراک بزارم.