ตัวเข้ารหัสและถอดรหัส Base45

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Base45 และแปลงกลับ Base45 ใช้อักขระ 45 ตัวของโหมดตัวอักษรและตัวเลข (alphanumeric) ใน QR code ข้อมูลไบนารีจึงใส่ลงใน QR code ได้โดยมีส่วนเกินน้อย

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. เลือก “เข้ารหัส” เพื่อแปลงข้อความเป็น Base45 หรือ “ถอดรหัส” เพื่อแปลง Base45 กลับเป็นข้อความหรือไบต์
  2. พิมพ์หรือวางอินพุต หรือเปิดไฟล์ อย่าลบช่องว่างใด ๆ เพราะช่องว่างเป็นส่วนหนึ่งของชุดตัวอักษร
  3. เมื่อถอดรหัสข้อมูลไบนารี เช่น เพย์โหลดของใบรับรอง ให้เปลี่ยนเอาต์พุตเป็น “เลขฐานสิบหก”
  4. คัดลอกผลลัพธ์หรือดาวน์โหลดเป็นไฟล์

Base45 คืออะไร

Base45 กำหนดไว้ใน RFC 9285 ชุดตัวอักษรประกอบด้วยตัวเลข 0-9 ตัวอักษรพิมพ์ใหญ่ A-Z และสัญลักษณ์อีกเก้าตัว ได้แก่ช่องว่างและ $ % * + - . / : ซึ่งก็คืออักขระ 45 ตัวที่ QR code เก็บได้ในโหมดตัวอักษรและตัวเลขแบบกะทัดรัดพอดี โปรดทราบว่าช่องว่างเป็นอักขระจริงของชุดตัวอักษร ไม่ใช่ตัวคั่น

ตัวเข้ารหัสจะรับอินพุตครั้งละสองไบต์ อ่านเป็นตัวเลขตั้งแต่ 0 ถึง 65535 แล้วเขียนตัวเลขนั้นเป็นเลข Base45 สามหลัก โดยเริ่มจากหลักที่มีนัยสำคัญน้อยที่สุด ไบต์เดี่ยวที่เหลือท้ายสุดจะกลายเป็นอักขระสองตัว ในรูปข้อความ ผลลัพธ์มีขนาด 1.5 เท่าของอินพุต ซึ่งใหญ่กว่า Base64

ทำไม Base45 จึงเหมาะกับ QR code

ในโหมดตัวอักษรและตัวเลข QR code บรรจุอักขระสองตัวใน 11 บิต Base64 ใช้โหมดนี้ไม่ได้เพราะต้องใช้ตัวพิมพ์เล็ก จึงต้องใช้โหมดไบต์ซึ่งใช้อักขระละ 8 บิต หรือประมาณ 10.7 บิตต่อข้อมูลหนึ่งไบต์ ส่วน Base45 ใช้เพียง 8.25 บิตต่อไบต์ในโหมดตัวอักษรและตัวเลข ข้อมูลชุดเดียวกันจึงใส่ลงใน QR code ที่เล็กกว่าและสแกนง่ายกว่าได้

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

ถอดรหัสใบรับรองโควิดดิจิทัลของสหภาพยุโรป

QR code ของใบรับรองโควิดดิจิทัลของสหภาพยุโรป (EU Digital COVID Certificate) มีข้อความที่ขึ้นต้นด้วย HC1: ส่วนที่เหลือเป็น Base45 โดยข้อมูลใบรับรองถูกเข้ารหัสเป็น CBOR ลงลายเซ็นด้วย COSE บีบอัดด้วย zlib แล้วจึงเข้ารหัสเป็น Base45 หากต้องการดูข้อมูลภายใน ให้ทำดังนี้

  1. ลบตัวนำหน้า HC1: ออก อักขระทั้งสี่ตัวนี้เป็น Base45 ที่ถูกต้อง หากไม่ลบออกจะได้ไบต์ที่ผิด
  2. ถอดรหัสส่วนที่เหลือที่นี่โดยใช้เอาต์พุตแบบเลขฐานสิบหก ข้อมูล zlib มักขึ้นต้นด้วยไบต์ 78
  3. คลายการบีบอัดไบต์ด้วย zlib และแยกวิเคราะห์ CBOR ด้วยเครื่องมืออื่น

เครื่องมือนี้จัดการเฉพาะขั้นตอน Base45 เท่านั้น ไม่ได้คลายการบีบอัด แยกวิเคราะห์ข้อมูล หรือตรวจสอบลายเซ็น

Base45 ในโค้ด

# Python (pip install base45)
import base45
base45.b45encode(b'AB')     # ตัวอย่างจาก RFC 9285: BB8
base45.b45decode('BB8')     # b'AB'

ข้อกำหนด

ชุดตัวอักษร0-9 A-Z ช่องว่าง $ % * + - . / :
ขนาดเอาต์พุต3 อักขระต่อ 2 ไบต์ (150%)
แพดดิงไม่มี
มาตรฐานRFC 9285
แยกตัวพิมพ์เล็ก-ใหญ่ใช่

ตัวอย่าง

อินพุต (UTF-8)เอาต์พุต
Hello, World!%69 VDK2E:3404ESVDX0
Base64.isSH8LQEG%61*5P2
你好C-SEFK*.K

คำถามที่พบบ่อย

ทำไมเอาต์พุต Base45 จึงมีช่องว่าง

ช่องว่างเป็นหนึ่งในอักขระ 45 ตัวของชุดตัวอักษร จึงบรรจุข้อมูลอยู่ด้วย อย่าตัดหรือยุบช่องว่างในข้อความ Base45 มิฉะนั้นการถอดรหัสจะล้มเหลวหรือได้ไบต์ที่ผิด

จะถอดรหัสสตริง HC1: ได้อย่างไร

ลบตัวนำหน้า HC1: ออก ถอดรหัสส่วนที่เหลือโดยใช้เอาต์พุตแบบเลขฐานสิบหก จากนั้นคลายการบีบอัดผลลัพธ์ด้วย zlib และอ่านข้อมูล CBOR ด้วยเครื่องมืออื่น เครื่องมือนี้ทำเฉพาะขั้นตอน Base45 เท่านั้น

Base45 แยกตัวพิมพ์เล็ก-ใหญ่หรือไม่

แยก มีเพียงตัวพิมพ์ใหญ่ที่อยู่ในชุดตัวอักษร เพราะโหมดตัวอักษรและตัวเลขของ QR code ไม่มีตัวพิมพ์เล็ก อินพุตตัวพิมพ์เล็กจะถูกแจ้งว่าไม่ถูกต้องพร้อมตำแหน่ง

Base45 กะทัดรัดกว่า Base64 หรือไม่

ในรูปข้อความธรรมดา ไม่ใช่ เพราะ Base45 มีขนาด 1.5 เท่าของอินพุต ส่วน Base64 ประมาณ 1.33 เท่า แต่ภายใน QR code ใช่ เพราะ Base45 ใช้โหมดตัวอักษรและตัวเลขที่บรรจุข้อมูลได้หนาแน่นกว่า