สารบัญ:

การใช้ Mifare Ultralight C กับ RC522 บน Arduino: 3 ขั้นตอน
การใช้ Mifare Ultralight C กับ RC522 บน Arduino: 3 ขั้นตอน

วีดีโอ: การใช้ Mifare Ultralight C กับ RC522 บน Arduino: 3 ขั้นตอน

วีดีโอ: การใช้ Mifare Ultralight C กับ RC522 บน Arduino: 3 ขั้นตอน
วีดีโอ: สอน Arduino วิธีใช้ PN532 Arduino โมดูล RFID/NFC สำหรับบอร์ด Arduino ESP8266 ESP32 จบในคลิปเดียว 2024, กรกฎาคม
Anonim
การใช้ Mifare Ultralight C กับ RC522 บน Arduino
การใช้ Mifare Ultralight C กับ RC522 บน Arduino

การใช้เทคโนโลยี RFID เพื่อระบุผู้ถือบัตรหรืออนุญาตให้ดำเนินการบางอย่าง (เปิดประตู ฯลฯ) เป็นวิธีการทั่วไป ในกรณีของแอปพลิเคชัน DIY โมดูล RC522 นั้นใช้กันอย่างแพร่หลาย เนื่องจากมีราคาถูกและมีโค้ดจำนวนมากสำหรับโมดูลนี้

ในกรณีส่วนใหญ่ UID ของการ์ดจะใช้เพื่อ "ระบุ" ผู้ถือบัตร และใช้การ์ด Mifare Classic เนื่องจากราคาถูกและมักจะรวมอยู่ในการซื้อโมดูล RC522

แต่อย่างที่คุณอาจทราบ ระบบ Mifare Classic ถูกแฮ็กมาหลายปีแล้ว และไม่ถือว่าปลอดภัยอีกต่อไป ระบบเข้ารหัส Crypto1 ที่ใช้โดยการ์ดคลาสสิกสามารถเอาชนะได้และเป็นการ์ดที่เขียนซ้ำได้ซึ่งข้อมูลที่สามารถตั้งโปรแกรม UID ใหม่ได้ (การ์ดเวทมนตร์)

ดังนั้นสำหรับแอปพลิเคชันที่เกี่ยวข้องกับการรักษาความปลอดภัย จึงไม่แนะนำให้ใช้การ์ด Mifare Classic! เช่นเดียวกับ (ส่วนใหญ่) ระบบ NTAG และ Mifare Ultralight

ดังนั้นทางเลือกคือใช้ระบบมืออาชีพหรือพยายามใช้ระบบ RFID ที่ปลอดภัยยิ่งขึ้น ระบบที่มีจำหน่าย ได้แก่ Mifare Ultralight C, Mifare DESfire และ Mifare Plus เนื่องจากมีหลายระบบระดับมืออาชีพที่ใช้ระบบที่ปลอดภัยกว่านี้ สำหรับชุมชน DIY แทบไม่มีวิธีแก้ปัญหา (มีโซลูชัน DESFire ที่ใช้ Teensy อยู่หนึ่งตัว ซึ่งอยู่ในบอร์ดฝ่าวงล้อม PN523 ที่มีราคาแพงกว่า) นอกจากนี้การ์ด DESFire นั้นค่อนข้างแพง ความท้าทายคือการหาทางออกที่ดีกว่าและถูกกว่า

โซลูชันที่นำเสนอนี้ช่วยให้เข้าถึงการ์ด Mifare Ultralight “C” ราคาถูกได้อย่างเต็มที่โดยใช้โมดูล RC522 DIY ของจีนราคาถูก จากรหัสนี้ Mifare Ultralight C ที่ปลอดภัยสามารถใช้ในแอปพลิเคชัน DIY

ขั้นตอนที่ 1: เงื่อนไขเบื้องต้น

เงื่อนไขเบื้องต้น
เงื่อนไขเบื้องต้น

แม้ว่า RC522 จะได้รับการออกแบบมาอย่างดี แต่โดยส่วนใหญ่แล้ว โครงสร้างไม่ดีเนื่องจากส่วนประกอบบางอย่างมีขนาดไม่ดี สิ่งนี้นำไปสู่ชื่อเสียงที่ไม่ดีของโมดูลที่มีความไวต่ำและจะไม่มีการระบุการ์ดทุกประเภท โดยเฉพาะอย่างยิ่ง Mifare Ultralight C จะไม่ถูกระบุและจะไม่สามารถอ่านการ์ดได้

ปัญหาหลักคือข้อกำหนดของตัวเหนี่ยวนำ L1 และ L2 ตามที่อธิบายไว้ใน https://ham.marsik.org/2017/04/using-cheap-rc522-nfc-reader-to-read.html เพียงแค่เปลี่ยนตัวเหนี่ยวนำเหล่านี้เป็นตัวที่เหมาะสมเช่น ทันใดนั้น FERROCORE CW1008-2200 RC522 ก็แสดงให้เห็นศักยภาพที่แท้จริงของมัน

ดังนั้นก่อนที่จะลองใช้รหัสที่กำหนด คุณต้องเปลี่ยนตัวเหนี่ยวนำ มันจะไม่ทำงานกับตัวเหนี่ยวนำที่ติดตั้งไว้ล่วงหน้า!

เบื้องหลังทั้งหมดนี้คือการ์ด Ultralight C ค่อนข้างหิวพลังงาน พลังงานนี้จัดทำโดย RC522 RF-field เนื่องจากค่าแอมแปร์ต่ำของตัวเหนี่ยวนำ สนามพลังงานไม่แข็งแรงพอที่จะจ่ายไฟให้กับ Ultralight C การ์ดอื่นๆ เช่น Mifare Classic ต้องการพลังงานน้อยกว่าและทำงานได้ค่อนข้างเสถียร

ขั้นตอนที่ 2: มันทำงานอย่างไร

มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?
มันทำงานอย่างไร?

ดังนั้นหลังจากแก้ไขโมดูล RC522 คุณจะใช้ Mifare Ulralight C สำหรับแอปพลิเคชันของคุณได้อย่างไร

เคล็ดลับคือ Mifare Ultralight C รองรับการตรวจสอบรหัสผ่านตามรหัส 3DES โดยใช้รหัสผ่านนี้ เนื้อหาของการ์ดสามารถทำให้ "อ่านอย่างเดียว" หรือผู้ใช้ที่ไม่ได้รับอนุญาตมองไม่เห็นอย่างสมบูรณ์

เพื่อที่จะใช้การป้องกันด้วยรหัสผ่านนี้ รหัสผ่านจะต้องถูกเขียนลงในการ์ดและหน้าจะต้องได้รับการปกป้อง เมื่อเสร็จแล้ว คุณสามารถตรวจสอบบัตรในแอปพลิเคชันของคุณได้โดยเพียงแค่ขอการรับรองความถูกต้องตามรหัสผ่านหรือข้อมูลเพิ่มเติมพร้อมจากพื้นที่ที่ได้รับการป้องกัน เฉพาะในกรณีที่ประสบความสำเร็จ คุณจะรู้ว่าคุณสามารถเชื่อถือ UID ที่ให้ไว้ในการ์ดได้

ระวัง: หากไม่มีการตรวจสอบสิทธิ์ด้วยรหัสผ่าน คุณยังไม่สามารถเชื่อถือการ์ด Mifare Ultralight C ได้ เนื่องจากมี "การ์ดเวทมนตร์" เช่นกันที่จำลอง Ultralight C

การ์ดแต่ละใบที่เป็นอิสระจากเทคโนโลยี (หากอยู่ในความถี่ที่ถูกต้อง) จะตอบสนองด้วย UID เมื่อขับเคลื่อนโดย RF-field และขอให้ระบุตัวตน นอกจากนี้ยังให้ค่า SAK โดยให้ข้อมูลน้อยที่สุดเกี่ยวกับประเภทของบัตรที่มีอยู่ น่าเสียดายที่ Mifare Ultralight และ NTAG ทั้งหมดระบุว่าเป็นประเภท syme (SAK=0x00) รวมถึง Mifare Ultralight C ดังนั้นเมื่อทำการสำรวจหาการ์ด อย่างน้อยค่า SAK ที่ 0x00 จะให้คำใบ้ว่าอาจมี Ultralight C บนเครื่องอ่าน.

เพื่อให้แน่ใจว่าเป็น Ultralight C คำขอสำหรับการรับรองความถูกต้องที่เข้ารหัสสามารถส่งไปยังการ์ดได้ หากนี่ไม่ใช่การ์ด Ultralight C คำขอนี้จะไม่เข้าใจ และการตอบสนองจะเป็น NAK (ไม่ยอมรับ)

หากนี่คือการ์ด Ulralight C คุณจะได้รับคำตอบ 8 ไบต์ 8 ไบต์เหล่านี้เป็นตัวเลขสุ่ม “B” (RndB) ที่เข้ารหัสโดยคีย์ที่จัดเก็บไว้ในการ์ดโดยใช้รหัส 3DES

RndB ที่เข้ารหัสนี้ต้องถอดรหัสโดยใช้คีย์เดียวกันในโปรแกรม จากนั้นตัวเลขสุ่มนี้จะถูกแก้ไขเล็กน้อย (หมุนหนึ่งไบต์ → ไบต์ 1 จะถูกย้ายไปที่ไบต์ 8 และไบต์อื่นๆ ทั้งหมดจะถูกผลักให้ต่ำกว่าหนึ่งไบต์ จากนั้นจะเรียกว่า RndB’) จากนั้นโปรแกรมจะสร้างหมายเลขสุ่ม 8 ไบต์ "A" เอง (RndA) และแนบ RndA นี้กับ RndB ที่แก้ไขแล้ว สิ่งนี้ถูกเข้ารหัสอีกครั้งโดยใช้กุญแจและส่งไปยังการ์ด

การ์ดจะถอดรหัสข้อความและตรวจสอบว่า RndB' เหมาะสมกับ RndB ที่สร้างไว้ก่อนหน้านี้ในการ์ดหรือไม่ ถ้าตรงกัน บัตรก็รู้ โปรแกรมรู้คีย์

ณ จุดนี้โปรแกรมยังไม่ทราบว่าการ์ดรู้รหัสหรือไม่จึงเชื่อถือได้หรือไม่ เพื่อให้บรรลุสิ่งนี้ ตอนนี้การ์ดจะหมุน RndA ที่ถอดรหัสแล้วหนึ่งไบต์ จากนั้นจึงเข้ารหัสไบต์เหล่านี้โดยใช้คีย์และส่งกลับ

โปรแกรมจะถอดรหัสการตอบกลับของการ์ดและตรวจสอบว่า RndA เดิมและ RndA ที่ตอบกลับตรงกันหรือไม่ เฉพาะเมื่อทั้งสองหน่วยงาน (โปรแกรมและการ์ด) รู้ว่าพวกเขาแบ่งปันความรู้ของคีย์เดียวกัน

กระบวนการนี้ใช้เพื่อรับรองความถูกต้องเท่านั้น การสื่อสารเพิ่มเติมทั้งหมดอยู่ใน "ข้อความที่ชัดเจน" เสมอ

แม้ว่าจะมีการ์ด "magic Ultralight C" ที่สามารถปรับเปลี่ยน UID ได้ แต่ไม่สามารถรับคีย์จากการ์ดได้และรหัส 3DES นั้นค่อนข้างปลอดภัย คีย์คือคีย์ 16 ไบต์ ดังนั้นการใช้กำลังเดรัจฉานในการรับคีย์จึงต้องใช้เวลาพอสมควร

ตามที่ระบุไว้ การสื่อสารก่อนการรับรองความถูกต้องและหลังการรับรองความถูกต้องจะเป็นข้อความที่ชัดเจนเสมอ (หรือที่รู้จักกันว่าไม่ได้เข้ารหัส) เมื่อเขียนคีย์ใหม่ลงในการ์ด เนื้อหาของคีย์สามารถดมกลิ่นได้โดยใช้อุปกรณ์ที่เหมาะสม ดังนั้นโปรดเขียนรหัสเฉพาะในสภาพแวดล้อมที่ปลอดภัยและเก็บกุญแจไว้เป็นความลับ

เมื่อใช้การ์ด Ultralight C

การ์ด Ultralight C มีคุณสมบัติด้านความปลอดภัยหลายแบบในตัว:

  1. หน่วยความจำการเขียนโปรแกรมครั้งเดียว (OTP) ในพื้นที่นี้สามารถเขียนบิตได้ บัสไม่ถูกลบ
  2. ตัวนับทางเดียว 16 บิต ตัวนับนี้สามารถเพิ่มได้เมื่อเข้าถึงเท่านั้น
  3. การป้องกัน "เขียน" หรือ "อ่าน/เขียน" ของหน้าในหน่วยความจำ เฉพาะในกรณีที่ตรวจสอบสิทธิ์ด้วยคีย์เท่านั้น หน้าเหล่านี้สามารถอ่านหรือแก้ไขได้
  4. การหยุด / การบล็อกของแต่ละหน้าเพื่อป้องกันการแก้ไขใด ๆ

ทั้งการใช้ OTP ตัวนับ 16 บิตหรือการใช้บิตบล็อกจะไม่ถูกนำไปใช้ในโค้ดที่กำหนด แต่สามารถใช้งานได้ง่ายตามข้อมูลที่ระบุใน https://www.nxp.com/docs/en/data- แผ่น/MF0ICU2.pd…

เนื่องจากการป้องกันด้วยคีย์เป็นสิ่งจำเป็นสำหรับการใช้ Mifare Ultralight C จึงมีฟังก์ชันที่เกี่ยวข้องทั้งหมด

คำสั่งทั้งหมดถูกใช้ใน Serial monitor ด้วย "new line only" และ 115200 Baud

  • “auth 49454D4B41455242214E4143554F5946” จะขอการรับรองความถูกต้องด้วยคีย์ที่ให้มา (ในกรณีนี้คือคีย์ Mifare Ultralight C มาตรฐาน)
  • “ดัมพ์” จะดัมพ์เนื้อหาของการ์ดเท่าที่มองเห็นได้ ในกรณีที่เพจได้รับการปกป้องโดยคีย์ เพจเหล่านี้อาจไม่ปรากฏให้เห็นจนกว่าจะมีการรับรองความถูกต้องด้วยคีย์ก่อนหน้านี้ ในสองคอลัมน์แรก จะมีการระบุว่าเพจถูกล็อคหรือถูกจำกัดการเข้าถึง
  • “newKey 49454D4B41455242214E4143554F5946” จะเขียนรหัสใหม่ลงในการ์ด คีย์ถูกเขียนไว้ที่หน้า 44 ถึง 47 ซึ่งจะใช้ได้ก็ต่อเมื่อหน้าเหล่านี้ไม่ได้ล็อกหรือป้องกันโดยไม่มีการพิสูจน์ตัวตนครั้งก่อน
  • "wchar 10 สวัสดีชาวโลก" จะเขียนว่า "สวัสดีชาวโลก" โดยเริ่มตั้งแต่หน้า 10 อีกครั้ง เฉพาะหน้าที่นี้เท่านั้นที่ไม่ถูกล็อกหรือป้องกันโดยไม่มีการพิสูจน์ตัวตนครั้งก่อน เมื่อพยายามจะเขียนว่าหน้า 39 หรือต่ำกว่าหน้า 4 จะขึ้นข้อความ ข้อผิดพลาดหรือข้อมูลจะถูกละเว้นเนื่องจากหน้าเหล่านี้ไม่ใช่หน่วยความจำของผู้ใช้
  • “whex 045ACBF44688” จะเขียนค่า Hex โดยตรงไปยังหน่วยความจำ เงื่อนไขก่อนหน้านี้จะมีผลบังคับใช้
  • “protect 30” ปกป้องทุกหน้าตั้งแต่หน้า 30 ขึ้นไป ขึ้นอยู่กับการอนุญาต หน้าเหล่านี้สามารถแก้ไขได้หรืออ่านหลังจากการตรวจสอบสิทธิ์ก่อนหน้าด้วยคีย์เท่านั้น การใช้ “protect” ที่มีค่าสูงกว่า 47 จะตั้งค่าเพจทั้งหมดเป็น “unprotected” รวมถึงคีย์ที่หน้า 44-47 (ซึ่งกว่าจะสามารถแก้ไขได้แต่ไม่สามารถอ่านได้) เพื่อป้องกันการเปลี่ยนแปลงคีย์ การป้องกันควรเริ่มต้นที่หน้า 44 เป็นอย่างน้อย
  • “setpbit 0” ตั้งค่าบิตป้องกันและตัดสินใจว่าเพจที่ได้รับการป้องกันเป็นแบบอ่านอย่างเดียว (“setpbit 1”) หรือไม่สามารถอ่านไม่ได้เขียน (“setpbit 0”) หากไม่มีการตรวจสอบสิทธิ์ก่อนหน้าด้วยคีย์

ไม่สามารถใช้คำสั่งทั้งหมดได้ทันทีหลังจากตรวจพบการ์ด "การถ่ายโอนข้อมูล" ก่อนหน้านี้ไปยังคำสั่งอื่นจะช่วยได้เสมอ

ขั้นตอนที่ 3: สำคัญ

  1. โปรแกรมแยกความแตกต่างระหว่างประเภท Ultralight โดยการอ่านหน้า 43 และ 44 หากหน้า 43 อ่านได้และหน้า 44 ไม่อ่าน น่าจะเป็น Ultralight C แต่หากคุณอ่าน/เขียนป้องกันหน้า 43 การ์ดจะไม่ถูกจดจำอีกต่อไป Ultralight C (ไม่มีผลใดๆ) การระบุ Ultralight ที่ถูกต้องควรทำผ่านการตรวจสอบสิทธิ์ด้วยคีย์ (ฉันไม่ได้ใช้งานเนื่องจากเหตุผลด้านความเสถียร)
  2. ก่อนที่จะใช้คำสั่ง "setpbit" และ "protect" ต้องใช้คำสั่ง "dump" มิฉะนั้นจะไม่ทราบสถานะการป้องกันของเพจ
  3. หากคุณ “อ่าน/เขียน” ปกป้องหน้าแรกของการ์ดของคุณ โปรแกรมจะไม่ทำงานอีกต่อไป เนื่องจากหน้าแรกจะถูกอ่านอย่างต่อเนื่องเพื่อดูว่ายังมีการ์ดอยู่หรือไม่ เนื่องจากสองหน้าแรกเป็นแบบอ่านอย่างเดียว (UID ถูกเก็บไว้ที่นั่น) จึงไม่มีความสมเหตุสมผลในการปกป้อง

ปัญหาความเสถียร

รหัสนี้ใช้ไลบรารี RC522 "มาตรฐาน" สำหรับ Arduino และไลบรารี 3DES จาก https://github.com/Octoate/ArduinoDES ในขณะที่ใช้ไลบรารี RC522 ค่อนข้างบ่อย ไลบรารี 3DES ดูเหมือนไม่แพร่หลายนัก และต้องติดตั้งด้วยตนเอง

รหัสได้รับการทดสอบบน Arduino Uno แต่ขณะเขียน ฉันพบปัญหาแปลกๆ มากมายเกี่ยวกับความเสถียร อย่างใดทักษะการเขียนโปรแกรมของฉันก็ไม่ค่อยดี ไลบรารีที่ใช้แล้วตัวใดตัวหนึ่งไม่เสถียรหรือการผสมไลบรารีนั้นไม่ใช่ความคิดที่ดี

โปรดระลึกไว้เสมอว่าเมื่อใช้รหัส!!!

การเปลี่ยนหรือใช้เพียงบางส่วนอาจทำให้เกิดพฤติกรรมแปลก ๆ เช่น การหยุดทำงาน การพิมพ์สิ่งแปลก ๆ หรือหมดเวลา หรือ NAK เมื่ออ่านจากการ์ด สิ่งนี้สามารถเกิดขึ้นได้ทุกที่ในโค้ด (ฉันต้องเสียเวลาหลายชั่วโมงในการดีบั๊ก) หากคุณพบเหตุผลในเรื่องนี้ โปรดบอกใบ้

แนะนำ: