Files
03-brute-force/readme.md
2026-05-03 09:37:26 +00:00

388 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# پروژه آموزشی: شبیه‌سازی حمله 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