-
سه شنبه, ۲۵ شهریور ۱۳۹۹، ۱۲:۳۶ ب.ظ
-
۴۸۵۵
الگوریتم تشخیص صحت شماره کارت بانکی در پایتون (اصلاح و تایید شده)
درود به همه !
ممنون از آقا مهدی بابت اصلاح اسکریپت . این اسکریپت اصلاح شده و روی کارت های هدیه هم کار خواهد داد و به درستی کار میکند .
در این پست برسی میکنیم چگونه میتوان توسط الگوریتمی که معرفی میکنیم ، بدون اتصال به منبع خارجی ، صحت یک شماره کارت بانکی را تعیین کرد و این الگوریتم را در پایتون پیاده سازی خواهیم کرد . هکر ها از این روش برای ساخت درگاه های جعلی بانک استفاده میکنند و تشخیص میدهند شماره کارت وارد شده صحیح هست یا نه .
خب همونطور که میدونید شماره کارت بانکی یک عدد ۱۶ رقمی هستش . در الگوریتم ما، از سمت چپ شروع به شمارش میکنیم .
- رقم اول از سمت چپ نمایانگر نوع کارت است (برای کارت های بانکی و اعتباری این عدد ۴ یا ۵ یا ۶ است)
- ۵ رقم بعدی یعنی ارقام ۲ تا ۶ نمایانگر شماره شناسایی صادر کننده ی کارت است (جدول شماره شناسایی انواع بانک ها را در آخر پست خواهیم گذاشت)
- ارقام ۷ تا ۱۵ نمایانگر شماره حساب یا همان شماره منحصر به فرد کارت است
- نهایتا رقم آخر یعنی رقم شانزدهم ، کد کنترلی است که از ۱۵ رقم اول بدست میاید
جدول توضیحات بالا :
|
ساختار کد 16 رقمی کارت های بانکی و اعتباری |
|||||||||||||||||
| ارقام کد | رقم کنترل | شماره منحصر به فرد در مرکز صادر کننده کارت برای | شناسه صادر کننده | نوع کارت | |||||||||||||
| موقعیت |
16 |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
اما چگونه صحت یک شماره کارت را تشخیص دهیم :
از سمت چپ شروع میکنیم و ارقام موقعیت فرد را ضرب در ۲ و ارقام موقعیت زوج را ضرب در ۱ میکنیم . اگر حاصل ضرب هر مرحله ، عددی بیش از ۹ شد ، ۹ واحد از آن کم میکنیم تا تبدیل به عددی تک رقمی شود . سپس اعداد حاصل را با هم جمع میکنیم . اگر حاصل جمع بر ۱۰ بخش پذیر بود یعنی شماره کارت صحیح است و در غیر این صورت شماره کارت صحیح نیست .
الگوریتم را با یک مثال برسی میکنیم . آیا شماره کارت 6274129005473742 صحیح است ؟
برای اینکار الگوریتم بالا را طی میکنیم :
|
ساختار کد 16 رقمی کارت های بانکی و اعتباری |
||||||||||||||||
| ارقام کد | رقم کنترل | شماره منحصر به فرد در مرکز صادر کننده کارت برای دارنده کارت | شناسه صادر کننده | نوع کارت | ||||||||||||
| موقعیت |
16 |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| ارقام کارت |
2 |
4 | 7 | 3 | 7 | 4 | 5 | 0 | 0 | 9 | 2 | 1 | 4 | 7 | 2 | 6 |
| الگوی ضرب |
1 |
2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 |
| محاسبه حاصل ضرب | 2 | 8 | 7 | 6 | 7 | 8 | 5 | 0 | 0 | 9 | 2 | 2 | 4 | 5 | 2 | 3 |
card_number = input("Card Number : ")
sum = 0
for i in range(len(card_number)):
if (i+1) % 2 == 0:
result = int(card_number[i]) * 1
else:
if (int(card_number[i]) * 2) > 9:
result = (int(card_number[i]) * 2) - 9
else:
result = int(card_number[i]) * 2
sum += result
if sum % 10 == 0:
print("Valid Card Number :)")
else:
print("InValid Card Number :(")
توضیح سورس کد :
توضیح خاصی نیاز نداره . در خط اول که اومدیم شماره کارت رو گرفتیم . در خط بعد یه متغییر به نام sum تعریف کردیم که قراره حاصل جمع حاصل های ضرب داخلش ریخته بشه . سپس با یه حلقه ی for اومدیم موقعیت های فرد رو ضربدر ۲ و موقعیت های زوج رو ضربدر ۱ کردیم و اضافه کردیم به متغییر sum
در نهایت یه if گذاشتیم و چک کردیم اگه sum بر عدد ۱۰ بخش پذیر بود یعنی کارت صحیحه در غیر این صورت صحیح نیست.
در زیر ، لیست پیش شماره بانک های مختلف رو میبینید :
|
نام بانک |
پیش شماره کارت بانکی |
| بانک ملی ایران | ۶۰۳۷۹۹ |
| بانک سپه | ۵۸۹۲۱۰ |
| بانک توسعه صادرات | ۶۲۷۶۴۸ |
| بانک صنعت و معدن | ۶۲۷۹۶۱ |
| بانک کشاورزی | ۶۰۳۷۷۰ |
| بانک مسکن | ۶۲۸۰۲۳ |
| پست بانک ایران | ۶۲۷۷۶۰ |
| بانک توسعه تعاون | ۵۰۲۹۰۸ |
| بانک اقتصاد نوین | ۶۲۷۴۱۲ |
| بانک پارسیان | ۶۲۲۱۰۶ |
| بانک پاسارگاد | ۵۰۲۲۲۹ |
| بانک قوامین | ۶۳۹۵۹۹ |
| بانک کارآفرین | ۶۲۷۴۸۸ |
| بانک سامان | ۶۲۱۹۸۶ |
| بانک سینا | ۶۳۹۳۴۶ |
| بانک سرمایه | ۶۳۹۶۰۷ |
| بانک شهر |
۵۰۴۷۰۶ ۵۰۲۸۰۶ |
| بانک دی | ۵۰۲۹۳۸ |
| بانک صادرات | ۶۰۳۷۶۹ |
| بانک ملت | ۶۱۰۴۳۳ |
| بانک تجارت |
۶۲۷۳۵۳ ۵۸۵۹۸۳ |
| بانک رفاه | ۵۸۹۴۶۳ |
| بانک انصار | ۶۲۷۳۸۱ |
| بانک مهر اقتصاد | ۶۳۹۳۷۰ |
| موسسه اعتباری نور | ۵۰۷۶۷۷ |
| موسسه اعتباری توسعه | ۶۲۸۱۵۷ |
| موسسه اعتباری کوثر | ۵۰۵۸۰۱ |
| موسسه اعتباری ملل (عسکریه) | ۶۰۶۲۵۶ |
| بانک قرض الحسنه مهرایرانیان | ۶۰۶۳۷۳ |
با استفاده از ۶ رقم اول کارت و بهره گیری از جدول بالا در اسکریپت خود میتونید تشخیص بدید هر شماره کارت از چه بانکی هستش .
الگوریتم برگرفته از آقای علی آرش یا حق !
Telegram Channel : @mrpythonblog
سید پارسا بنی هاشمی