python บัตรปชช



https://gist.github.com/bouroo/8b34daf5b7deed57ea54819ff7aeef6e

https://preechaik59.medium.com/%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2-python-%E0%B8%AD%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9A%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%8A%E0%B8%99-gui-save-to-database-and-excel-part2-8e6088ce2bc3


https://preechaik59.medium.com/%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2-python-%E0%B8%AD%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9A%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%8A%E0%B8%99-part1-3b7e897294b0


https://linuxhint.com/install-python-pip-ubuntu-22-04/


pip3 install resize-image

pip3 install xlsxwriter

pip3 install pypng

pip3 install pyqrcode

if no beep

sudo apt install beep

First run sudo modprobe pcspkr and then beep should work.

tk.tk().bell()

print('\007')

git clone urlxxx

git log

git pull

git diff

git status -s

git add filexxx

git commit -m "xxxxxxxx"

git push origin master

if git pull error

   git reset --hard HEAD    and then git pull again

sudo apt-get -y install python3-pip

python2 -m pip install xxxx

python3 -m pip install xxxx

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

sudo python get-pip.py

python --version   # (this will reflect your choice, see above) python3 --version $(head -1 `which pip` | tail -c +3) --version $(head -1 `which pip3` | tail -c +3) --version

sudo apt-get install python-tk

sudo apt-get install python3-tk

sudo apt  install libpython3.8-dev python3.8-dev

sudo apt install libpcsclite-dev

pip3 install --upgrade pyscard

sudo apt-get install pcscd python-pyscard

sudo apt-get install python3-pyscard

sudo apt-get install python-pip

pip install reportlab

sudo apt install python-testresources

sudo apt-get install python-mysqldb

sudo apt-get install python3-mysql.connector

sudo apt-get install python-mysql.connector

pip install --user mysql-connector-python

sudo apt-get install python-imaging python-imaging-tk

sudo apt install python-pil # for python 2.X

and/or...

python3 -m pip install reportlab

python3 -m pip install pyscard

python3 -m pip install Pillow

or

sudo apt install python3-pil # for python 3.X including python3.6

python3.7 -m pip install pillow

sudo apt install python3-pil.imagetk

pip install pyqrcode --user

pip install pypng --user

pip3 install pyqrcode --user

pip3 install pypng --user

how to downgrade pip # pip10 still bug dont upgrade pip

    python -m pip install pip==9.0.1

if no module configparser

    pip install configparser --user

After updating pip using pip install -U pip,

$pip --version error

bash: /home/kri/.local/bin/pip: No such file or directory

$type pip

pip is hashed (/home/kri/.local/bin/pip)

to repair

$ hash -r

When the cache is clear, pip is working again.

If you're using Ubuntu 16.04 LTS, you'll need to use a PPA:

sudo add-apt-repository ppa:jonathonf/python-3.6 # (only for 16.04 LTS)

Then, run the following (this works out-of-the-box on 16.10 and 17.04):

sudo apt update

sudo apt install python3.6 sudo apt install python3.6-dev sudo apt install python3.6-venv wget https://bootstrap.pypa.io/get-pip.py sudo python3.6 get-pip.py sudo ln -s /usr/bin/python3.6 /usr/local/bin/python3 sudo ln -s /usr/local/bin/pip /usr/local/bin/pip3  # Do this only if you want python3 to be the default Python# instead of python2 (may be dangerous, esp. before 2020):# sudo ln -s /usr/bin/python3.6 /usr/local/bin/python

python --version   # (this will reflect your choice, see above) python3 --version $(head -1 `which pip` | tail -c +3) --version $(head -1 `which pip3` | tail -c +3) --version

#python camera install

python -m pip install numpy

python -m pip install opencv-python

$ sudo apt-get update

$ sudo apt-get install build-essential cmake

$ sudo apt-get install libopenblas-dev liblapack-dev

$ sudo apt-get install libx11-dev libgtk-3-dev

$ sudo apt-get install python python-dev python-pip

$ sudo apt-get install python3 python3-dev python3-pip

python -m pip install dlib

python -m pip install face_recognition

python -m pip install matplotlib

python -m pip install scipy

python -m pip install scikit-image # แทน skimage

#! /usr/bin/env python

# Jane.

# 2013-11-08 (Y-m-d)

# apt-get install pcscd python-pyscard

 

from smartcard.System import readers

import binascii

 

# Thailand ID Smartcard

# define the APDUs used in this script

 

# Reset

SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]

# CID

COMMAND1 = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]

COMMAND2 = [0x00, 0xc0, 0x00, 0x00, 0x0d]

# Fullname Thai + Eng + BirthDate + Sex

COMMAND3 = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0xd1]

COMMAND4 = [0x00, 0xc0, 0x00, 0x00, 0xd1]

# Address

COMMAND5 = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]

COMMAND6 = [0x00, 0xc0, 0x00, 0x00, 0x64]

# issue/expire

COMMAND7 = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x12]

COMMAND8 = [0x00, 0xc0, 0x00, 0x00, 0x12]

# get all the available readers

r = readers()

print "Available readers:", r

reader = r[0]

print "Using:", reader

connection = reader.createConnection()

connection.connect()

# Reset

data, sw1, sw2 = connection.transmit(SELECT)

print data

print "Select Applet: %02X %02X" % (sw1, sw2)

data, sw1, sw2 = connection.transmit(COMMAND1)

print data

print "Command1: %02X %02X" % (sw1, sw2)

# CID

data, sw1, sw2 = connection.transmit(COMMAND2)

print data

for d in data:

    print chr(d),

    print

print "Command2: %02X %02X" % (sw1, sw2)

# Fullname Thai + Eng + BirthDate + Sex

data, sw1, sw2 = connection.transmit(COMMAND3)

print data

print "Command3: %02X %02X" % (sw1, sw2)

data, sw1, sw2 = connection.transmit(COMMAND4)

print data

for d in data:

    print unicode(chr(d),"tis-620"),

    print

print "Command4: %02X %02X" % (sw1, sw2)

# Address

data, sw1, sw2 = connection.transmit(COMMAND5)

print data

print "Command5: %02X %02X" % (sw1, sw2)

data, sw1, sw2 = connection.transmit(COMMAND6)

print data

for d in data:

    print unicode(chr(d),"tis-620"),

    print

print "Command6: %02X %02X" % (sw1, sw2)

# issue/expire

data, sw1, sw2 = connection.transmit(COMMAND7)

print data

print "Command7: %02X %02X" % (sw1, sw2)

data, sw1, sw2 = connection.transmit(COMMAND8)

print data

for d in data:

    print unicode(chr(d),"tis-620"),

    print

print "Command8: %02X %02X" % (sw1, sw2)

ในการตรวจสอบเลขที่บัตรประชาชนนั้นทำได้โดยการใช้ Check Digit โดยใช้ตัวเลขหลักสุดท้ายในการตรวจสอบ Algorithm ของวิธีการใช้ Check Digit มีดังนี้

ตัวอย่าง 1-2345-67890-12-1

#!/usr/bin/env python

# bouroo

# 18.08.2017

# sudo apt-get -y install pcscd python-pyscard python-imaging

import os

import io

import Image

import binascii

from smartcard.System import readers

from smartcard.util import HexListToBinString, toHexString, toBytes

# Thailand ID Smartcard

# tis-620 to utf-8

def thai2unicode(data):

result = ''

if isinstance(data, list):

for d in data:

result += unicode(chr(d),"tis-620")

else :

result = data.decode("tis-620").encode("utf-8")

return result.strip();

def getData(cmd, req = [0x00, 0xc0, 0x00, 0x00]):

data, sw1, sw2 = connection.transmit(cmd)

data, sw1, sw2 = connection.transmit(req + [cmd[-1]])

return [data, sw1, sw2];

# define the APDUs used in this script

# https://github.com/chakphanu/ThaiNationalIDCard/blob/master/APDU.md

# Check card

SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]

THAI_CARD = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]

# CID

CMD_CID = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]

# TH Fullname

CMD_THFULLNAME = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0x64]

# EN Fullname

CMD_ENFULLNAME = [0x80, 0xb0, 0x00, 0x75, 0x02, 0x00, 0x64]

# Date of birth

CMD_BIRTH = [0x80, 0xb0, 0x00, 0xD9, 0x02, 0x00, 0x08]

# Gender

CMD_GENDER = [0x80, 0xb0, 0x00, 0xE1, 0x02, 0x00, 0x01]

# Card Issuer

CMD_ISSUER = [0x80, 0xb0, 0x00, 0xF6, 0x02, 0x00, 0x64]

# Issue Date

CMD_ISSUE = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x08]

# Expire Date

CMD_EXPIRE = [0x80, 0xb0, 0x01, 0x6F, 0x02, 0x00, 0x08]

# Address

CMD_ADDRESS = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]

# Photo_Part1/20

CMD_PHOTO1 = [0x80, 0xb0, 0x01, 0x7B, 0x02, 0x00, 0xFF]

# Photo_Part2/20

CMD_PHOTO2 = [0x80, 0xb0, 0x02, 0x7A, 0x02, 0x00, 0xFF]

# Photo_Part3/20

CMD_PHOTO3 = [0x80, 0xb0, 0x03, 0x79, 0x02, 0x00, 0xFF]

# Photo_Part4/20

CMD_PHOTO4 = [0x80, 0xb0, 0x04, 0x78, 0x02, 0x00, 0xFF]

# Photo_Part5/20

CMD_PHOTO5 = [0x80, 0xb0, 0x05, 0x77, 0x02, 0x00, 0xFF]

# Photo_Part6/20

CMD_PHOTO6 = [0x80, 0xb0, 0x06, 0x76, 0x02, 0x00, 0xFF]

# Photo_Part7/20

CMD_PHOTO7 = [0x80, 0xb0, 0x07, 0x75, 0x02, 0x00, 0xFF]

# Photo_Part8/20

CMD_PHOTO8 = [0x80, 0xb0, 0x08, 0x74, 0x02, 0x00, 0xFF]

# Photo_Part9/20

CMD_PHOTO9 = [0x80, 0xb0, 0x09, 0x73, 0x02, 0x00, 0xFF]

# Photo_Part10/20

CMD_PHOTO10 = [0x80, 0xb0, 0x0A, 0x72, 0x02, 0x00, 0xFF]

# Photo_Part11/20

CMD_PHOTO11 = [0x80, 0xb0, 0x0B, 0x71, 0x02, 0x00, 0xFF]

# Photo_Part12/20

CMD_PHOTO12 = [0x80, 0xb0, 0x0C, 0x70, 0x02, 0x00, 0xFF]

# Photo_Part13/20

CMD_PHOTO13 = [0x80, 0xb0, 0x0D, 0x6F, 0x02, 0x00, 0xFF]

# Photo_Part14/20

CMD_PHOTO14 = [0x80, 0xb0, 0x0E, 0x6E, 0x02, 0x00, 0xFF]

# Photo_Part15/20

CMD_PHOTO15 = [0x80, 0xb0, 0x0F, 0x6D, 0x02, 0x00, 0xFF]

# Photo_Part16/20

CMD_PHOTO16 = [0x80, 0xb0, 0x10, 0x6C, 0x02, 0x00, 0xFF]

# Photo_Part17/20

CMD_PHOTO17 = [0x80, 0xb0, 0x11, 0x6B, 0x02, 0x00, 0xFF]

# Photo_Part18/20

CMD_PHOTO18 = [0x80, 0xb0, 0x12, 0x6A, 0x02, 0x00, 0xFF]

# Photo_Part19/20

CMD_PHOTO19 = [0x80, 0xb0, 0x13, 0x69, 0x02, 0x00, 0xFF]

# Photo_Part20/20

CMD_PHOTO20 = [0x80, 0xb0, 0x14, 0x68, 0x02, 0x00, 0xFF]

# get all the available readers

r = readers()

print "Available readers:", r

reader = r[0]

print "Using:", reader

connection = reader.createConnection()

connection.connect()

atr = connection.getATR()

print "ATR: " + toHexString(atr)

if (atr[0] == 0x3B & atr[1] == 0x67):

req = [0x00, 0xc0, 0x00, 0x01]

else :

req = [0x00, 0xc0, 0x00, 0x00]

# Check card

data, sw1, sw2 = connection.transmit(SELECT + THAI_CARD)

print "Select Applet: %02X %02X" % (sw1, sw2)

# CID

data = getData(CMD_CID, req)

cid = thai2unicode(data[0])

print "CID: " + cid

# TH Fullname

data = getData(CMD_THFULLNAME, req)

print "TH Fullname: " + thai2unicode(data[0])

# EN Fullname

data = getData(CMD_ENFULLNAME, req)

print "EN Fullname: " + thai2unicode(data[0])

# Date of birth

data = getData(CMD_BIRTH, req)

print "Date of birth: " + thai2unicode(data[0])

# Gender

data = getData(CMD_GENDER, req)

print "Gender: " + thai2unicode(data[0])

# Card Issuer

data = getData(CMD_ISSUER, req)

print "Card Issuer: " + thai2unicode(data[0])

# Issue Date

data = getData(CMD_ISSUE, req)

print "Issue Date: " + thai2unicode(data[0])

# Expire Date

data = getData(CMD_EXPIRE, req)

print "Expire Date: " + thai2unicode(data[0])

# Address

data = getData(CMD_ADDRESS, req)

print "Address: " + thai2unicode(data[0])

# PHOTO

photo = getData(CMD_PHOTO1, req)[0]

photo += getData(CMD_PHOTO2, req)[0]

photo += getData(CMD_PHOTO3, req)[0]

photo += getData(CMD_PHOTO4, req)[0]

photo += getData(CMD_PHOTO5, req)[0]

photo += getData(CMD_PHOTO6, req)[0]

photo += getData(CMD_PHOTO7, req)[0]

photo += getData(CMD_PHOTO8, req)[0]

photo += getData(CMD_PHOTO9, req)[0]

photo += getData(CMD_PHOTO10, req)[0]

photo += getData(CMD_PHOTO11, req)[0]

photo += getData(CMD_PHOTO12, req)[0]

photo += getData(CMD_PHOTO13, req)[0]

photo += getData(CMD_PHOTO14, req)[0]

photo += getData(CMD_PHOTO15, req)[0]

photo += getData(CMD_PHOTO16, req)[0]

photo += getData(CMD_PHOTO17, req)[0]

photo += getData(CMD_PHOTO18, req)[0]

photo += getData(CMD_PHOTO19, req)[0]

photo += getData(CMD_PHOTO20, req)[0]

data = HexListToBinString(photo)

f = open(cid + ".jpg", "wb")

f.write(data)

f.close

รหัสประเทศไทยตามมาตรฐาน ISO 3166 คือ 764 ครับ หรือถ้าเป็นตัวอักษร 2 หลักก็คือ TH

และแบบตัวอักษร 3 หลักคือ THA

นอกจากนี้ ISO 3166-2:TH ยังระบุรหัสจังหวัดไว้ด้วย ซึ่งก็สอดคล้องกับรหัสของกระทรวง

มหาดไทยตาม #2 เช่น

TH-10 = กรุงเทพ

TH-55 = น่าน

ประเภทใบอนุญาต

Type of Driving Licence

รวมใบอนุญาตทั้งสิ้น

Grand Total

ก. รวมใบอนุญาตขับรถตามกฎหมายว่าด้วยรถยนต์

     Total Driving Licence under Motor Vehicle Act

      1. ใบอนุญาตขับรถยนต์ส่วนบุคคลชั่วคราว Private  Automobile (Temporary)

      2. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลชั่วคราว Private  Motor  Tricycle (Temporary)

      3. ใบอนุญาตขับรถจักรยานยนต์ชั่วคราว Motorcycle (Temporary)

      4. ใบอนุญาตขับรถยนต์ส่วนบุคคลหนึ่งปี Private  Automobile (One Year)  

      5. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลหนึ่งปี Private  Motor  Tricycle (One Year)             

      6. ใบอนุญาตขับรถจักรยานยนต์หนึ่งปี Motorcycle (One Year)          

      7. ใบอนุญาตขับรถยนต์ส่วนบุคคล Private  Automobile (Five Years)  

      8. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคล Private  Motor  Tricycle (Five Years)             

      9. ใบอนุญาตขับรถจักรยานยนต์ Motorcycle (Five Years)          

      10. ใบอนุญาตขับรถยนต์ส่วนบุคคลตลอดชีพ Private  Automobile (Life)

      11. ใบอนุญาตขับรถยนต์สามล้อส่วนบุคคลตลอดชีพ Motor  Tricycle (Life)

      12. ใบอนุญาตขับรถจักรยานยนต์ตลอดชีพ Motorcycle (Life)

     13. ใบอนุญาตขับรถยนต์สาธารณะ Public  Automobile

     14. ใบอนุญาตขับรถยนต์สามล้อสาธารณะ Public  Motor  Tricycle

     15. ใบอนุญาตขับรถจักรยานยนต์สาธารณะ Public  Motorcycle

     16. ใบอนุญาตขับรถระหว่างประเทศ International  Driving  Licence

     17. ใบอนุญาตขับรถบดถนน Tractor

     18. ใบอนุญาตขับรถแทรกเตอร์ Tractor Driving Licence

     19. ใบอนุญาตขับรถใช้งานเกษตรกรรม Farm Vehicle Driving Licence

     20. ใบอนุญาตขับรถอื่นๆ Others Driving Licence

ข. รวมใบอนุญาตผู้ประจำรถตามกฎหมายว่าด้วยการขนส่งทางบก

     Total Transport Personnel Licence under Land Transport Act

      1. ผู้ขับรถ Driver Licence

          แยกเป็น - ชนิดที่ 1 Truck & Bus (Class I)

                        - ชนิดที่ 2 Truck & Bus (Class II)

                        - ชนิดที่ 3 Truck & Bus (Class III)

                        - ชนิดที่ 4 Truck & Bus (Class IV)

       2. นายตรวจ Inspector Licence

       3. ผู้เก็บค่าโดยสาร Conductor Licence

       4. ผู้บริการ Bus Hostess

ค. รวมใบอนุญาตขับขี่ล้อเลื่อน (Total Driving Licence under Non Motorized Vehicle Act)

ชนิดของใบขับขี่ตามกฎหมายว่าด้วยรถยนต์

 

 

กำลังหัดใช้ Python 3 ใน Linux mint อ่านชื่อภาษาไทยจากบัตรประชาชนทีละ byte ผ่านเครื่องอ่าน smart card แต่มันเป็น single byte ตามคำสั่งด้านล่าง โดยส่ง item เป็นตำแหน่งชื่อภาษาไทย ปัญหาตรง result มันไม่ใช่ utf-8 ครับ

    def readSmatcard(self, item):

        response, sw1, sw2 = self.cardservice.connection.transmit( item )

        if not sw1 == 0x61:

            return 'n/a'

        GET_RESPONSE = [0X00, 0XC0, 0x00, 0x00 ]

        apdu = GET_RESPONSE + [sw2]

        response, sw1, sw2 = self.cardservice.connection.transmit( apdu )

        result = ''

        for i in response:

            result += chr(i)

        return result.strip()

ค่าที่อ่านได้จากบัตรเป็นอย่างไรครับ เช่น ก เท่ากับ 161 หรือเปล่า ถ้าใช่ก็แปลว่าค่าที่อ่านออกมาเป็น tis-620 หรือ iso-8859-11

วิธีแปลงเป็น unicode string ให้สร้าง bytearray จากค่าที่อ่านได้ทั้งหมดก่อน จากนั้นก็ decode ด้วย encoding 'thai' ค่าที่ได้จะเป็น unicode string แล้วครับ ตัวอย่าง

สร้าง bytearray ที่ a[0] = 0xA1 หรือตัว ก ตาม tis-620

>>> a = bytearray.fromhex('a1')

>>> a

bytearray(b'\xa1')

แปลง bytearray a เป็น string ด้วยคำสั่ง decode

>>> b = a.decode('thai')

b เป็น string 'ก'

>>> b

'ก'

b เป็น unicode (b[0] เท่ากับ 3585 หรือ 0x0E01 ซึ่งเป็นรหัส ก ตาม unicode)

>>> ord(b)

3585

แต่ถ้าอ่าน byte ออกมาเป็น encoding แบบอื่น ก็ทำแบบเดียวกันครับ จับมาเรียงใส่ bytearray แล้วก็ decode ออกมาด้วย encoding แบบนั้นๆ

ผมเขียนเรื่องนี้สำหรับเป็น guideline สำหรับคนที่อยากอ่านข้อมูลในบัตรประชาชนนะครับ

ข้อมูลทั้งหมดได้มาจากคุณพุฒิพงศ์ ซึ่งเป็นคนพัฒนาโปรแกรม นี้ ครับ

ผมเมลไปถามแกหน้าด้าน ๆ เลยครับว่าทำยังไง แกก็ตอบมาแบบละเอียดเลยครับ

เลยไหน ๆ ก็ไหน ๆ ละขอเขียนทิ้งไว้ก็แล้วกันครับเผื่อมีคนอยากทราบวิธี

ผมใช้ lib ของ python pyscard ครับ วิธีการใช้ดูจาก documentation เลยครับ

ตัวอย่างเป็นการอ่านข้อมูลในส่วน public ของ smart card

# -*- coding: cp874 -*-

from smartcard.CardConnection import CardConnection

from smartcard.CardType import AnyCardType

from smartcard.CardRequest import CardRequest

from smartcard.util import toHexString, toBytes

import ธรรมดาครับ

cardtype = AnyCardType()

cardrequest = CardRequest( timeout=1, cardType=cardtype )

cardservice = cardrequest.waitforcard()

cardservice.connection.connect()

เชื่อมต่อไปยัง reader ดูว่ามีการ์ดเสียบอยู่นะ

SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]

THAI_ID_CARD = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]

REQ_CID = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]

REQ_THAI_NAME = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0x64]

REQ_ENG_NAME = [0x80, 0xb0, 0x00, 0x75, 0x02, 0x00, 0x64]

REQ_GENDER = [0x80, 0xb0, 0x00, 0xE1, 0x02, 0x00, 0x01]

REQ_DOB = [0x80, 0xb0, 0x00, 0xD9, 0x02, 0x00, 0x08]

REQ_ADDRESS = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]

REQ_ISSUE_EXPIRE = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x12]

DATA = [REQ_CID,REQ_THAI_NAME,REQ_ENG_NAME,REQ_GENDER,REQ_DOB,

REQ_ADDRESS,REQ_ISSUE_EXPIRE]

ตรงนี้เป็นคำสั่งในการขอข้อมูลครับ คือ ขั้นตอนการขอข้อมูลจากการ์ดจะเป็น

1. ฉันจะอ่านบัตรประชาชนนะนายใช่บัตรประชาชนรึเปล่า

2. บัตรตอบมาว่าใช่หรือไม่

3. โอเค ฉันอยากได้ข้อมูลเลข 13 หลักที่มีความยาว x

4. บัตรตอบกลับมาว่าฉันมีข้อมูลนี้ ยาว x

5. ขอดูข้อมูลหน่อยละกัน

6. บัตรส่งข้อมูลให้

apdu = SELECT+THAI_ID_CARD

f = open(‘temp.txt’,’w’)

response, sw1, sw2 = cardservice.connection.transmit( apdu )

#print ‘response: ‘, response, ‘ status words: ‘, “%x %x” % (sw1, sw2)

อันนี้เป็นข้อ 1-2 ครับ ดูตรง sw1 กับ sw2 ครับ ถ้าโอเคจะตอบกลับมาเป็น

0x90 xx หรือ 0x61 xx ซึ่ง 90 คือโอเค ส่วน 61 คือ โอเคแต่มีข้อมูล xx ไบต์นะ

#print ‘response: ‘, response, ‘ status words: ‘, “%x %x” % (sw1, sw2)

for d in DATA:

response, sw1, sw2 = cardservice.connection.transmit( d )

print sw1

if sw1 == 0x61:

ไล่ขอข้อมูลใน list DATA ส่วนนี้สังเกตว่าบัตรตอบกลับมาว่า 0x61 มีข้อมูลอีก xx นะ

เริ่มจาก cid

GET_RESPONSE = [0X00, 0XC0, 0x00, 0x00 ]

apdu = GET_RESPONSE + [sw2]

ตรงนี้ขอดูข้อมูลที่บอกว่ามีหน่อย

print ‘sending ‘ + toHexString(apdu)

response, sw1, sw2 = cardservice.connection.transmit( apdu )

print ‘response: ‘, toHexString(response), ‘ status words: ‘, “%x %x” % (sw1, sw2)

result = “”

for i in response:

result = result+chr(i)

f.write(result.strip()+”\n”)

ส่วนนี้แค่ไล่อ่านจนครบทุกข้อมูล จริง ๆ จะมีรูปภาพอีกครับแต่ไม่ได้ทำไว้เพราะอายุบัตรค่อนข้างนาน

รูปในบัตรจะดูห่างจากตัวจริงเยอะไป

#apdu บัตรปชช

Get response 0x00, 0xC0, 0x00, 0x00 + Len in hex

INS 0xB0 | Read Bin INS 0xC0 | Get response

SELECT FILE CLA = 0X00 INS = 0XA4 P1 = 0x04 | Direct selection by DF name (data field=DF name) P2 = 0x00 Lc = 0x08 ( len of DF Name )

Thailand Personal DF Name 0xA0, 0X00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01