واحد حفاظت و امنیت
در این تمرین، شما یک کلاس پایتون با نام Security طراحی و پیادهسازی خواهید کرد که شامل متدهایی برای رمزنگاری رشتهها بر اساس یک الگوریتم مشخص و همچنین شناسایی و ایمنسازی اطلاعات حسابهای شبکههای اجتماعی در یک متن است.
وظیفهی شما تکمیل پیادهسازی سه متد اصلی این کلاس است که در ادامه توضیح داده شدهاند.
🔹 متد encrypt(self, s)
این متد یک رشته s را بهعنوان ورودی دریافت کرده و معادل رمزنگاریشدهی آن را بر اساس الگوریتم زیر در خروجی بازمیگرداند.
📌 الگوریتم رمزنگاری
- تقسیم به زیررشتههای یونیفرم: رشتهی ورودی
sبه زیررشتههای متوالی یونیفرم تقسیم میشود. یک زیررشتهی یونیفرم رشتهای است که تمام کاراکترهای آن یکسان باشند. مثال:'c'،'aa'و'ddd'- رمزنگاری هر زیررشتهی یونیفرم: وزن کاراکتر: وزن هر کاراکتر انگلیسی کوچک برابر با کد عددی آن کاراکتر منهای عدد ۹۶ است. مثال:
'a'→ 1،'b'→ 2،'c'→ 3 محاسبهی مقدار رمزنگاری: برای یک زیررشتهی یونیفرم، با پیمایش کاراکترها از چپ به راست: به ازای اولین کاراکتر:(0 + 1) × weightبه ازای دومین کاراکتر:(1 + 1) × weightبه ازای nامین کاراکتر:(n-1 + 1) × weight- الحاق مقادیر رمزنگاریشده: مقدار رمزنگاریشده رشته اصلی از به هم چسباندن (الحاق) مقادیر رمزنگاریشده تمام زیررشتههای یونیفرم به ترتیب ظاهر شدن آنها به دست میآید.
رشتهی
'abcccdd'به زیررشتههای'a'،'b'،'ccc'و'dd'تقسیم میشود.
'a'→ وزن 1 →(0+1)×1 = 1→'1''b'→ وزن 2 →(0+1)×2 = 2→'2''ccc'→ وزن 3 →3, 6, 9→'369''dd'→ وزن 4 →4, 8→'48'خروجی نهایی:
'1236948'
🔹 متد is_social_account_info(self, param)
این متد یک رشته param را بهعنوان ورودی دریافت کرده و بررسی میکند که آیا این رشته دقیقاً منطبق با الگوی مشخصشده برای اطلاعات یک حساب شبکه اجتماعی هست یا خیر.
📌 قوانین هر بخش
- نام شبکه اجتماعی (Social Network Name): با یک حرف بزرگ انگلیسی شروع شده و با یک یا چند حرف انگلیسی دیگر ادامه مییابد (فقط شامل حروف انگلیسی). مثال:
GitHub- دامنه ([domain]): شامل حروف کوچک انگلیسی، اعداد و کاراکتر نقطه (.) است و باید حداقل یک نقطه داشته باشد. مثال:
example.comیاdl.example.com- نام کاربری ([username]): شامل حروف انگلیسی (کوچک و بزرگ)، اعداد و کاراکتر زیرخط (_) است. مثال:
javafanیاuser_123
ورودی:
Instagram:www.instagram.com/javafan✅ True
ورودی:
Facebook:www.facebook.com/Ali#Alavi❌ False
دلیل: کاراکتر # در نام کاربری
ورودی:
MySite:mysite.net/user123❌ False
دلیل: نبود بخش
www.
🔹 متد secure(self, info)
این متد یک رشتهی متنی info را به عنوان ورودی دریافت میکند که ممکن است حاوی اطلاعات مختلفی از جمله اطلاعات حسابهای کاربری شبکههای اجتماعی باشد. این متد با استفاده از دو متد قبلی، بخشهای مربوط به نام کاربری حسابهای اجتماعی شناساییشده را رمزنگاری میکند.
📌 فرایند ایمنسازی
- بخشهایی را که دقیقاً منطبق با الگوی اطلاعات حساب شبکهی اجتماعی هستند، پیدا کنید
- برای هر بخش، قسمت مربوط به نام کاربری ([username]) را استخراج کنید
- نام کاربری استخراجشده را با استفاده از متد
encryptرمزنگاری کنید- در رشتهی اصلی، نام کاربری را با مقدار رمزنگاریشده جایگزین کنید
- رشتهی نهایی را پس از اعمال تمام جایگزینیها برگردانید
💡 فقط نام کاربری رمزنگاری میشود، نه کل رشته.
ورودی:
"Instagram:www.instagram.com/aalavi Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi"
Instagram:www.instagram.com/aalavi→ نام کاربریaalavi→ رمزنگاری:12121229Twitter:www.twiter.com/alaviii→ نام کاربریalaviii→ رمزنگاری:11212291827imdb:www.imdb.com/alavi→ با الگو مطابقت ندارد (imdb با حرف بزرگ شروع نشده) → بدون تغییرخروجی:
"Instagram:www.instagram.com/12121229 Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi"
✅ پاسخ نهایی
import re
class Security:
# [Name]:www.[domain with at least one dot]/[username]
ACCOUNT = r"[A-Z][A-Za-z]+:www\.(?=[a-z0-9.]*\.)[a-z0-9.]+/([A-Za-z0-9_]+)"
def encrypt(self, s):
result = []
i = 0
while i < len(s):
ch = s[i]
weight = ord(ch) - 96
count = 0
while i < len(s) and s[i] == ch:
count += 1
result.append(str(count * weight))
i += 1
return "".join(result)
def is_social_account_info(self, param):
return re.fullmatch(self.ACCOUNT, param) is not None
def secure(self, info):
def replace(match):
whole = match.group(0)
cut = match.start(1) - match.start(0)
return whole[:cut] + self.encrypt(match.group(1))
return re.sub(self.ACCOUNT, replace, info)
📄 main.py
📖 توضیح کد
- متد
encrypt: با پیمایش رشته، زیررشتههای یونیفرم را شناسایی میکند وزن هر کاراکتر =ord(ch) - 96برای هر کاراکتر در زیررشته،(شمارنده + 1) × وزنرا محاسبه کرده و به نتیجه اضافه میکند - متد
is_social_account_info: از عبارت منظم (Regular Expression) برای بررسی الگو استفاده میکند الگوی^[A-Z][a-zA-Z]+:www\.[a-z0-9.]+/[a-zA-Z0-9_]+$اگر رشته دقیقاً با الگو مطابقت داشته باشد،Trueو در غیر این صورتFalseبرمیگرداند - متد
secure: با استفاده ازre.finditerتمام بخشهای منطبق با الگو را پیدا میکند برای هر بخش، نام کاربری را استخراج کرده و باencryptرمزنگاری میکند نام کاربری را با مقدار رمزنگاریشده جایگزین میکند برای جلوگیری از تداخل جایگزینی، بخشها از انتها به ابتدا پردازش میشوند
- در متد
is_social_account_info، دقت کنید که فقط حروف انگلیسی مجاز هستند و نام شبکه اجتماعی باید با حرف بزرگ شروع شود- در متد
secure، فقط نام کاربری رمزنگاری میشود و بقیهی قسمتهای آدرس بدون تغییر میمانند- از
reبرای تطابق الگو و یافتن بخشها استفاده شده است
🚀 پس از تکمیل کلاس، میتوانید آن را با رشتههای مختلف تست کنید و از صحت عملکرد آن اطمینان حاصل کنید.
نمونهها
s = Security()
[s.encrypt("abcccdd"), s.encrypt("a"), s.encrypt("zz"), s.encrypt("aalavi"), s.encrypt("")]['1236948', '1', '2652', '12121229', '']
s = Security()
[s.is_social_account_info("Instagram:www.instagram.com/javafan"),
s.is_social_account_info("Facebook:www.facebook.com/Ali#Alavi"),
s.is_social_account_info("MySite:mysite.net/user123")][True, False, False]
s = Security()
[s.is_social_account_info("GitHub:www.dl.github.com/user_123"),
s.is_social_account_info("Twitter:www.twitter/abc"),
s.is_social_account_info("instagram:www.instagram.com/abc"),
s.is_social_account_info("X:www.x.com/abc"),
s.is_social_account_info("Instagram:www.Instagram.com/abc")][True, False, False, False, False]
Security().secure("Instagram:www.instagram.com/aalavi Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi")'Instagram:www.instagram.com/12121229 Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi'
s = Security()
s.secure("no accounts here")
s.secure("Twitter:www.twitter/abc and GitHub:www.github.com/bb")'no accounts here' 'Twitter:www.twitter/abc and GitHub:www.github.com/24'
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود