Add readme.md
This commit is contained in:
387
readme.md
Normal file
387
readme.md
Normal 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
|
||||||
Reference in New Issue
Block a user