-
سه شنبه, ۲۵ شهریور ۱۳۹۹، ۱۲:۳۶ ب.ظ
-
۳۸۲۶
الگوریتم تشخیص صحت شماره کارت بانکی در پایتون (اصلاح و تایید شده)
درود به همه !
ممنون از آقا مهدی بابت اصلاح اسکریپت . این اسکریپت اصلاح شده و روی کارت های هدیه هم کار خواهد داد و به درستی کار میکند .
در این پست برسی میکنیم چگونه میتوان توسط الگوریتمی که معرفی میکنیم ، بدون اتصال به منبع خارجی ، صحت یک شماره کارت بانکی را تعیین کرد و این الگوریتم را در پایتون پیاده سازی خواهیم کرد . هکر ها از این روش برای ساخت درگاه های جعلی بانک استفاده میکنند و تشخیص میدهند شماره کارت وارد شده صحیح هست یا نه .
خب همونطور که میدونید شماره کارت بانکی یک عدد ۱۶ رقمی هستش . در الگوریتم ما، از سمت چپ شروع به شمارش میکنیم .
- رقم اول از سمت چپ نمایانگر نوع کارت است (برای کارت های بانکی و اعتباری این عدد ۴ یا ۵ یا ۶ است)
- ۵ رقم بعدی یعنی ارقام ۲ تا ۶ نمایانگر شماره شناسایی صادر کننده ی کارت است (جدول شماره شناسایی انواع بانک ها را در آخر پست خواهیم گذاشت)
- ارقام ۷ تا ۱۵ نمایانگر شماره حساب یا همان شماره منحصر به فرد کارت است
- نهایتا رقم آخر یعنی رقم شانزدهم ، کد کنترلی است که از ۱۵ رقم اول بدست میاید
جدول توضیحات بالا :
ساختار کد 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