# پروژه آموزشی: شبیه‌سازی حمله Brute Force در Kotlin در این تمرین می‌خواهیم ببینیم **کامپیوتر چگونه می‌تواند با امتحان کردن همه حالت‌ها یک رمز را پیدا کند.** به این روش در امنیت کامپیوتر **Brute Force Attack** گفته می‌شود. در این برنامه: 1. کامپیوتر یک **رمز ۴ رقمی تصادفی** می‌سازد. 2. سپس برنامه شروع می‌کند **همه اعداد از 0 تا 9999 را امتحان کردن**. 3. اگر یکی از آن‌ها با رمز برابر باشد، رمز پیدا می‌شود. --- # کد کامل برنامه ```kotlin import kotlin.random.Random fun main() { var generatedPassword = "" for (i in 0..3) { val digit = Random.nextInt(10) generatedPassword += digit.toString() } println("رمز تولید شده (فقط برای تست): $generatedPassword") println("شروع تست brute force...") for (i in 0..9999) { println("تلاش برای $i ... ") if (i == generatedPassword.toInt()) { println("Found! رمز پیدا شد: $i") break } } println("پایان تست brute force.") } ``` --- # مرحله ۱ — تولید رمز تصادفی ```kotlin var generatedPassword = "" ``` در این خط یک **متغیر رشته‌ای (String)** ساخته‌ایم که قرار است رمز داخل آن ذخیره شود. در ابتدا مقدار آن خالی است. --- ```kotlin for (i in 0..3) ``` این یک **حلقه for** است. این حلقه **۴ بار اجرا می‌شود**: ``` 0 1 2 3 ``` ما می‌خواهیم یک **رمز ۴ رقمی** بسازیم، پس این حلقه ۴ بار اجرا می‌شود تا ۴ رقم تولید کند. --- ```kotlin val digit = Random.nextInt(10) ``` اینجا یک **عدد تصادفی** تولید می‌کنیم. تابع: ``` Random.nextInt(10) ``` عددی بین این بازه تولید می‌کند: ``` 0 تا 9 ``` پس هر بار یک رقم تصادفی ساخته می‌شود. مثلاً: ``` 3 7 1 9 ``` --- ```kotlin generatedPassword += digit.toString() ``` در این خط عدد تولید شده به **رشته تبدیل** می‌شود. چرا؟ چون متغیر `generatedPassword` از نوع **String** است. مثال: ``` digit = 3 ``` بعد از تبدیل: ``` "3" ``` حالا به رمز اضافه می‌شود. مثال روند ساخت رمز: ``` "" -> "3" "3" -> "37" "37" -> "371" "371" -> "3719" ``` در نهایت رمز مثلاً می‌شود: ``` 3719 ``` --- # نمایش رمز (فقط برای تست) ```kotlin println("رمز تولید شده (فقط برای تست): $generatedPassword") ``` این خط فقط برای **آزمایش برنامه** است. در دنیای واقعی نباید رمز چاپ شود. اما برای اینکه ببینیم برنامه درست کار می‌کند آن را نمایش می‌دهیم. --- # شروع حمله Brute Force ```kotlin println("شروع تست brute force...") ``` فقط برای اطلاع دادن به کاربر است. --- # حلقه اصلی Brute Force ```kotlin for (i in 0..9999) ``` در اینجا برنامه همه اعداد ممکن را امتحان می‌کند. بازه: ``` 0 1 2 3 ... 9999 ``` چرا تا 9999؟ چون رمز ما **۴ رقمی** است. تمام حالت‌های ممکن: ``` 0000 0001 0002 ... 9999 ``` --- # نمایش تلاش‌ها ```kotlin println("تلاش برای $i ... ") ``` در هر مرحله برنامه نشان می‌دهد که چه عددی را در حال امتحان کردن است. مثلاً: ``` تلاش برای 0 ... تلاش برای 1 ... تلاش برای 2 ... ... ``` --- # بررسی درست بودن رمز ```kotlin if (i == generatedPassword.toInt()) ``` در اینجا بررسی می‌کنیم: آیا عددی که الان امتحان می‌کنیم (`i`) با رمز واقعی برابر است؟ اما یک نکته مهم وجود دارد. رمز ما از نوع **String** است: ``` "3719" ``` اما `i` یک **عدد (Int)** است. پس باید رمز را تبدیل کنیم: ``` generatedPassword.toInt() ``` مثال: ``` "3719" -> 3719 ``` حالا می‌توانیم مقایسه کنیم. --- # وقتی رمز پیدا شود ```kotlin println("Found! رمز پیدا شد: $i") break ``` اگر رمز پیدا شود: 1. پیام نمایش داده می‌شود. 2. با دستور `break` از حلقه خارج می‌شویم. چرا؟ چون دیگر لازم نیست ادامه بدهیم. --- # پایان برنامه ```kotlin println("پایان تست brute force.") ``` این خط نشان می‌دهد که برنامه تمام شده است. --- # مفهوم Brute Force **Brute Force** یعنی: > امتحان کردن تمام حالت‌های ممکن تا زمانی که جواب پیدا شود. در این مثال: کامپیوتر این کار را انجام می‌دهد: ``` 0000 0001 0002 0003 ... 3719 ✅ ``` وقتی به رمز درست برسد، آن را پیدا می‌کند. --- # نکته مهم تعداد حالت‌های ممکن برای رمز ۴ رقمی: ``` 10000 حالت ``` اگر رمز ۶ رقمی باشد: ``` 1,000,000 حالت ``` و اگر رمز طولانی‌تر باشد، پیدا کردن آن با brute force بسیار سخت‌تر می‌شود. به همین دلیل در سیستم‌های واقعی از: - رمزهای طولانی - محدودیت تعداد تلاش - captcha - قفل شدن حساب استفاده می‌شود. --- # تمرین برای دانشجویان ### تمرین ۱ یک متغیر اضافه کنید و **تعداد تلاش‌ها** را بشمارید. در پایان برنامه چاپ کنید: ``` رمز بعد از 5321 تلاش پیدا شد ``` --- ### تمرین ۲ کاری کنید که رمز **۵ رقمی** شود. --- ### تمرین ۳ کاری کنید که برنامه **هر 1000 تلاش یک پیام نمایش دهد** تا خروجی خیلی شلوغ نشود. --- ### تمرین ۴ (چالش) به جای امتحان کردن همه اعداد از `0..9999` با **۴ حلقه تو در تو** تمام حالت‌ها را بسازید. مثال: ``` 0000 0001 0002 ... 9999 ``` --- این تمرین به شما کمک می‌کند مفاهیم زیر را بهتر یاد بگیرید: - حلقه `for` - اعداد تصادفی - تبدیل نوع داده (`String` و `Int`) - شرط‌ها (`if`) - خروج از حلقه (`break`) - مفهوم Brute Force