الگوریتم تشخیص صحت شماره کارت بانکی در پایتون (اصلاح و تایید شده) :: Mr Python | مستر پایتون

الگوریتم تشخیص صحت شماره کارت بانکی در پایتون (اصلاح و تایید شده)

  • ۳۱۹۶

الگوریتم تشخیص صحت شماره کارت بانکی در پایتون (اصلاح و تایید شده)

درود به همه !

 

 ممنون از آقا مهدی بابت اصلاح اسکریپت . این اسکریپت اصلاح شده و روی کارت های هدیه هم کار خواهد داد و به درستی کار میکند .

 در این پست برسی میکنیم چگونه میتوان توسط الگوریتمی که معرفی میکنیم ، بدون اتصال به منبع خارجی ، صحت یک شماره کارت بانکی را تعیین کرد و این الگوریتم را در پایتون پیاده سازی خواهیم کرد . هکر ها از این روش برای ساخت درگاه های جعلی بانک استفاده میکنند و تشخیص میدهند شماره کارت وارد شده صحیح هست یا نه .

خب همونطور که میدونید شماره کارت بانکی یک عدد ۱۶ رقمی هستش . در الگوریتم ما،  از سمت چپ شروع به شمارش میکنیم .

  •  رقم اول از سمت چپ نمایانگر نوع کارت است (برای کارت های بانکی و اعتباری این عدد ۴ یا ۵ یا ۶ است)
  • ۵ رقم بعدی یعنی ارقام ۲ تا ۶ نمایانگر شماره شناسایی صادر کننده ی کارت است (جدول شماره شناسایی انواع بانک ها را در آخر پست خواهیم گذاشت)
  • ارقام ۷ تا ۱۵ نمایانگر شماره حساب یا همان شماره منحصر به فرد کارت است
  • نهایتا رقم آخر یعنی رقم شانزدهم ، کد کنترلی است که از ۱۵ رقم اول بدست میاید

جدول توضیحات بالا :

 

ساختار کد 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
 
همانطور که دقت کردید الگوی ضرب همیشه ۲۱۲۱۲۱۲۱۲۱۲۱۲۱۲۱ خواهد بود .
خب حاصل جمع تمام حاصل های ضرب را حساب میکنیم :
3 + 2 + 5 + 4 + 2 + 2 + 9 + 0 + 0 + 5 + 8 + 7 + 6 + 7 + 8  + 2 = 70
 
چون حاصل بر ۱۰ بخش پذیر است (۷۰ تقسیم بر ۱۰ مساوی ۷ است) ، پس این شماره کارت صحیح است .
 
تا اینجا الگوریتم کار را یاد گرفتیم . سورس زیر ، این الگوریتم را به طور خودکار انجام میدهد :
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

  • سید پارسا بنی هاشمی

    متد خلاصه تر:

    def check_card_number(card_number):
        r=[(1 if (i + 1) % 2 == 0 else 2) * int(card_number[i]) for i in range(len(card_number))]
        r=[(i-9 if i>9 else i) for i in r]
        return sum(r) % 10 == 0

     

    پاسخ:
    مچکرم
  • DBbank = [

    "627381=Ansar Bank",

    "621986=Blu Bank",

    "603799=Melli Bank",

    "589210=Sepah Bank",

    "627648=Saderat Bank",

    "603770=Keshavarzi Bank",

    "628023=Maskan Bank",

    "627412=Eghtesad Bank",

    "622106=Parsian Bank",

    "502229=Pasargad Bank",

    "639599=Ghavamin Bank",

    "639346=Sina Bank",

    "639607=Sarmaieh Bank",

    "504706=Shahr Bank",

    "502806=Shahr Bank",

    "502938=bank day",

    "603769=bank Saderat",

    "610433=bank Melat",

    "627353=bank tejarat",

    "885983=bank tejarat",

    "589463=bank Refah",

    "627381=bank Ansar",

    "639370=bank mehr Eghtesad",

    "507677=Moasese Nur",

    "628157=Moasese Tosehe",

    "505801=Moasese Kosar",

    "606256=Moasese Melal",

    "606373=Qarz Al-Hasna Mehriranian Bank"

    ]


     

    Cart_Target = str(input(" : "))

    print(Cart_Target[:6])

    for cartbank in DBbank:

        cartnumber = cartbank.split("=")[0]

        bankname = cartbank.split("=")[1]

        if Cart_Target[:6] == cartnumber:

            print("Cart Number : {}".format(cartnumber))

            print("Bank Number : {}".format(bankname))

            break

    input()

    پاسخ:
    عالی
  • سیدمحمد امامی رضوی

    متد خلاصه‌تر:

     

    def check_card_number(card_number):
        sum = 0
        for i in range(len(card_number)):
            result = (1 if (i + 1) % 2 == 0 else 2) * int(card_number[i])
            if result > 9:
                result = result - 9
            sum += result
        return sum % 10 == 0

  • سیدمحمد امامی رضوی
    if i+1 % 2 == 0:

    must be replaced by:

    if (i+1) % 2 == 0:
    پاسخ:
    تشکر . اصلاح شد .
  • بخش‌هایی از این نظر که با * مشخص شده، توسط مدیر سایت حذف شده است

    سلام 

    بله جواب داده موقع ارسال به هم ریخت فایل اصلی رو گذاشتم توی درایوم لینکش این پایینه:

    *********************************************************

    پاسخ:
    سلام .
    آهان اگه جواب داده که هیچی .
  • سلام و خسته نباشید من یه دیکشنری از بانک ها ساختم (یسریشون)و کاری کردم که بانک ها رو مشخص کنه

     

    card_number = input("Card Number : ")
    sum = 0
    for i in range(len(card_number)):
        if i % 2 == 0:
            result = int(card_number[i]) * 2
            if (result > 10):
                result=result - 9
                sum += result
            else:
                sum+=result
        else:
            result = int(card_number[i]) * 1
            sum+=result
    if(sum%10==0):
        print("The card number is correct! :)")
    else:
        print("Card number is incorrect! :(")

    card_number2 = card_number[0:6]

    bank = {"627381":"Ansar Bank",
            "603799":"Melli Bank",
            "589210":"Sepah Bank",
            "627648":"Saderat Bank",
            "603770":"Keshavarzi Bank",
            "628023":"Maskan Bank",
            "627412":"Eghtesad Bank",
            "622106":"Parsian Bank",
            "502229":"Pasargad Bank",
            "639599":"Ghavamin Bank",
            "639346":"Sina Bank",
            "639607":"Sarmaieh Bank",
            "504706":"Shahr Bank",
            "502806":"Shahr Bank",
            "۶۲۷۳۸۱":"Ansar Bank",
            "۶۰۳۷۹۹":"Melli Bank",
            "۵۸۹۲۱۰":"Sepah Bank",
            "۶۲۷۶۴۸":"Saderat Bank",
            "۶۰۳۷۷۰":"Keshavarzi Bank",
            "۶۲۸۰۲۳":"Maskan Bank",
            "۶۲۷۴۱۲":"Eghtesad Bank",
            "۶۲۲۱۰۶":"Parsian Bank",
            "۵۰۲۲۲۹":"Pasargad Bank",
            "۶۳۹۵۹۹":"Ghavamin Bank",
            "۶۳۹۳۴۶":"Sina Bank",
            "۶۳۹۶۰۷":"Sarmaieh Bank",
            "۵۰۴۷۰۶":"Shahr Bank",
            "۵۰۲۸۰۶":"Shahr Bank"}

    print(bank[card_number2])

    پاسخ:
    درود بر  شما.
    آفرین بسیار عالی . 
    فقط جواب داده بهتون این اسکریپت ؟ حس میکنم دیکشنری bank رو key  و value هاش رو برعکس تعریف کردید .
  • با عرض سلام و خسته نباشید 

    بنده تازه دارم کار با پایتون رو شروع می کنم و چیز زیادی بلد نیستم فقط یه سوال داشتم میشه بگید دقیقا چطور باید قسمت آخر همون بانک ها رو براش تعریف کنم.

    خیلی ممنون

    پاسخ:
    ببینید در ابتدا ۶ رقم اول شماره کارت رو جدا کنید و داخل متغییری مجزا ذخیره کنید .
    سپس با شرط های if میتونید چک کنید ببینید این اعداد چند هستند و از چه بانکی هستند .
    البته با ساخت یک دیکشنری از پیش شماره ها میشه کاری کرد نیاز به استفاده از if های پی در پی نباشه .
  • من با بعی کارت ها زدم غلط بودش

    پاسخ:
    درود بر شما . 
    جدیدا الگوریتم اصلاح شده و روی کارت های بانکی جواب داده . 
  • بازم حس میکنم سورس اشتباهه  البته عقیده منه چون خیلی وقتا ضرب در دو ک میکنم عددمون از 9 نمیزنه بالا نیازی نیست بخایم 9 تا ازش کم کنیم فک کنم باید مثل سورس خودم باشه که گذاشتش تو یه شرط ک اگه یه موقع بیشتر شد ازش کم کنه ممکنه رقم اول 3 باشه ک طبق سورس 3*2 میشه 6 ک نیازی نیست ازش 9 تا کم بشه ولی بازم شما دارید 9 تا کم میکنید البته جسارت نباشه بنده مبتدی ام در پایتون خوشحالم شدم ک تونستم کمکی هرچند کوچیک بکنم.☺♥

    پاسخ:
    ممنونم لطف دارید . 
    اگه دقت کنید شرط گذاشته شده که اگه بیشتر از ۹ شد ازش ۹ تا کم کنه. 
    بازم ممنون 
  • من همون مهدی ام lol
    رفتم رو سورس کار کردم مشکل داشت خودتون گفته بودید اگه بیشتر از 9 شد باید -9 کرد ولی انجام نداده بودید طبق سورس کد خودتون اینو تست کردم رو دو تا کارت صحیح بود خوشحال میشم اگه درست بود به بنده هم اطلاع بدید در اینستاگرام یا همینجا ایدی اینستاگرام بنده Mahdi._.Tavazohi 


    card_number = input("Card Number : ")
    sum = 0
    for i in range(len(card_number)):
        if i % 2 == 0:
            result = int(card_number[i]) * 2
            if (result > 10):
                result=result - 9
                sum += result
            else:
                sum+=result
        else:
            result = int(card_number[i]) * 1
            sum+=result
    if(sum%10==0):
        print("The card number is correct! :)")
    else:
        print("Card number is incorrect! :(")
     

    پاسخ:
    درود بر شما . 
    ممنونم آقا مهدی بابت پیگیریتون . درست میگید اشتباه از سورس ما بوده ببخشید . اصلاح شد . بسیار ممنونم از شما :)
  • من تست کردم رو کارت اصلی جواب نداد رو سه تا کارت تست کردم رو یه کارت هدیه جواب داد الگوریتمش اشتباهه

    پاسخ:
    درود بر شما . 
    در تست هایی که خودمون انجام میدادیم کار میداده . حالا دقیقا نمیدونم چه اتفاقی افتاده . 
    به هر حال مچکرم که خبر دادید . لطفا اگر الگوریتم صحیح تری پیدا کردید برای ما هم ارسال کنید . ممنون .
  • خیر شماره کارت اصلی هست و کاملا هم درسته :(

    پاسخ:
    واقعا ؟ 
    برای من هرچی تست کردم مشکلی نداشت . اگه مشکلشو پیدا کردین ممنون میشم بگین ما هم اصلاح کنیم .
    ممنونم 
  • سلام

     

    متاسفانه اشتباه کار میکنه من شماره کارت رو 4 بار وارد کردم قبول نمیکنه

    پاسخ:
    این الگوریتم روی کارت های اصلی جواب میدهد . 
    احتمالا شما دارید روی یک کارت هدیه تست میکنید .
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی