Add readme.md

This commit is contained in:
2026-05-03 09:37:26 +00:00
commit 193c175ee7

387
readme.md Normal file
View File

@@ -0,0 +1,387 @@
# پروژه آموزشی: شبیه‌سازی حمله 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