6.7 KiB
پروژه آموزشی: شبیهسازی حمله Brute Force در Kotlin
در این تمرین میخواهیم ببینیم کامپیوتر چگونه میتواند با امتحان کردن همه حالتها یک رمز را پیدا کند.
به این روش در امنیت کامپیوتر Brute Force Attack گفته میشود.
در این برنامه:
- کامپیوتر یک رمز ۴ رقمی تصادفی میسازد.
- سپس برنامه شروع میکند همه اعداد از 0 تا 9999 را امتحان کردن.
- اگر یکی از آنها با رمز برابر باشد، رمز پیدا میشود.
کد کامل برنامه
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
اگر رمز پیدا شود:
- پیام نمایش داده میشود.
- با دستور
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