2026-05-03 09:37:26 +00:00
2026-05-03 09:37:26 +00:00

پروژه آموزشی: شبیه‌سازی حمله Brute Force در Kotlin

در این تمرین می‌خواهیم ببینیم کامپیوتر چگونه می‌تواند با امتحان کردن همه حالت‌ها یک رمز را پیدا کند.
به این روش در امنیت کامپیوتر Brute Force Attack گفته می‌شود.

در این برنامه:

  1. کامپیوتر یک رمز ۴ رقمی تصادفی می‌سازد.
  2. سپس برنامه شروع می‌کند همه اعداد از 0 تا 9999 را امتحان کردن.
  3. اگر یکی از آن‌ها با رمز برابر باشد، رمز پیدا می‌شود.

کد کامل برنامه

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.")
}

مرحله ۱ — تولید رمز تصادفی

var generatedPassword = ""

در این خط یک متغیر رشته‌ای (String) ساخته‌ایم که قرار است رمز داخل آن ذخیره شود.

در ابتدا مقدار آن خالی است.


for (i in 0..3)

این یک حلقه for است.

این حلقه ۴ بار اجرا می‌شود:

0
1
2
3

ما می‌خواهیم یک رمز ۴ رقمی بسازیم، پس این حلقه ۴ بار اجرا می‌شود تا ۴ رقم تولید کند.


val digit = Random.nextInt(10)

اینجا یک عدد تصادفی تولید می‌کنیم.

تابع:

Random.nextInt(10)

عددی بین این بازه تولید می‌کند:

0 تا 9

پس هر بار یک رقم تصادفی ساخته می‌شود.

مثلاً:

3
7
1
9

generatedPassword += digit.toString()

در این خط عدد تولید شده به رشته تبدیل می‌شود.

چرا؟

چون متغیر generatedPassword از نوع String است.

مثال:

digit = 3

بعد از تبدیل:

"3"

حالا به رمز اضافه می‌شود.

مثال روند ساخت رمز:

""   -> "3"
"3"  -> "37"
"37" -> "371"
"371" -> "3719"

در نهایت رمز مثلاً می‌شود:

3719

نمایش رمز (فقط برای تست)

println("رمز تولید شده (فقط برای تست): $generatedPassword")

این خط فقط برای آزمایش برنامه است.

در دنیای واقعی نباید رمز چاپ شود.

اما برای اینکه ببینیم برنامه درست کار می‌کند آن را نمایش می‌دهیم.


شروع حمله Brute Force

println("شروع تست brute force...")

فقط برای اطلاع دادن به کاربر است.


حلقه اصلی Brute Force

for (i in 0..9999)

در اینجا برنامه همه اعداد ممکن را امتحان می‌کند.

بازه:

0
1
2
3
...
9999

چرا تا 9999؟

چون رمز ما ۴ رقمی است.

تمام حالت‌های ممکن:

0000
0001
0002
...
9999

نمایش تلاش‌ها

println("تلاش برای $i ... ")

در هر مرحله برنامه نشان می‌دهد که چه عددی را در حال امتحان کردن است.

مثلاً:

تلاش برای 0 ...
تلاش برای 1 ...
تلاش برای 2 ...
...

بررسی درست بودن رمز

if (i == generatedPassword.toInt())

در اینجا بررسی می‌کنیم:

آیا عددی که الان امتحان می‌کنیم (i)
با رمز واقعی برابر است؟

اما یک نکته مهم وجود دارد.

رمز ما از نوع String است:

"3719"

اما i یک عدد (Int) است.

پس باید رمز را تبدیل کنیم:

generatedPassword.toInt()

مثال:

"3719" -> 3719

حالا می‌توانیم مقایسه کنیم.


وقتی رمز پیدا شود

println("Found! رمز پیدا شد: $i")
break

اگر رمز پیدا شود:

  1. پیام نمایش داده می‌شود.
  2. با دستور break از حلقه خارج می‌شویم.

چرا؟

چون دیگر لازم نیست ادامه بدهیم.


پایان برنامه

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
Description
No description provided
Readme 26 KiB