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

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Base32 ด้วยชุดตัวอักษรเลขฐานสิบหกแบบขยายและแปลงกลับ กำหนดแพดดิงและตัวพิมพ์ได้ เช่น เพื่อสร้างป้ายชื่อแบบ NSEC3

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

วิธีใช้งาน

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

Base32hex คืออะไร

Base32hex คือ “Base 32 Encoding with Extended Hex Alphabet” ที่กำหนดไว้ในหัวข้อ 7 ของ RFC 4648 ซึ่งทำงานเหมือน Base32 มาตรฐานทุกประการ คืออักขระแต่ละตัวเก็บข้อมูล 5 บิต ทุก 5 ไบต์กลายเป็น 8 อักขระ และเอาต์พุตจะถูกเติมด้วย = จนความยาวเป็นพหุคูณของ 8 สิ่งที่ต่างกันมีเพียงชุดตัวอักษร แทนที่จะใช้ A-Z 2-7 Base32hex นับต่อจากจุดที่เลขฐานสิบหกหยุด คือตัวเลข 0 ถึง 9 แทนค่า 0 ถึง 9 ตัว A แทน 10 และตัว V แทน 31

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

ลำดับการเรียงยังคงเดิม

ชุดตัวอักษรเรียงตามลำดับ ASCII จากน้อยไปมาก และค่าของอักขระแต่ละตัวเพิ่มขึ้นตามตำแหน่ง ผลก็คือการเปรียบเทียบสตริง Base32hex สองสตริงทีละอักขระจะให้ลำดับเดียวกับการเปรียบเทียบไบต์ที่อยู่เบื้องหลัง RFC 4648 ระบุว่านี่คือคุณสมบัติที่ Base32 มาตรฐานและ Base64 ไม่มี ซึ่งทำให้ Base32hex เหมาะสำหรับใช้เป็นคีย์ในที่เก็บข้อมูลแบบเรียงลำดับ เช่น ฐานข้อมูลและ key-value store

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

Base32hex ใน NSEC3 ของ DNSSEC

เรคคอร์ด NSEC3 ซึ่งกำหนดไว้ใน RFC 5155 ใช้พิสูจน์ว่าชื่อ DNS หนึ่งไม่มีอยู่จริง พร้อมกับทำให้การไล่รายชื่อทุกชื่อในโซนทำได้ยากขึ้น แต่ละชื่อจะถูกแฮชด้วย SHA-1 และแฮชขนาด 20 ไบต์จะเขียนเป็นป้ายชื่อ Base32hex ยาว 32 อักขระโดยไม่มีแพดดิง ซึ่งมักแสดงเป็นตัวพิมพ์เล็ก เนื่องจากการเข้ารหัสคงลำดับของแฮชไว้ ชื่อที่ผ่านการแฮชจึงเรียงต่อกันเป็นสายตามลำดับ หากต้องการแปลงแฮชเป็นป้ายชื่อแบบนี้ ให้วางแฮชเป็นอินพุตแบบเลขฐานสิบหก ปิด “แพดดิง” และเลือก “ตัวพิมพ์เล็ก” เครื่องมือนี้ทำเฉพาะขั้นตอนการเข้ารหัสเท่านั้น ไม่ได้คำนวณแฮช NSEC3 ที่ใช้ salt และการวนซ้ำ

Base32hex ในโค้ด

# Python 3.10+
import base64
base64.b32hexencode(b'foobar')          # b'CPNMUOJ1E8======'
base64.b32hexdecode('CPNMUOJ1E8======') # b'foobar'

// Go (import "encoding/base32")
base32.HexEncoding.EncodeToString(data)
base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(data)

ข้อกำหนด

ชุดตัวอักษร0-9 A-V
ขนาดเอาต์พุต8 อักขระต่อ 5 ไบต์ (160%)
แพดดิงเติม = จนความยาวเป็นพหุคูณของ 8
มาตรฐานRFC 4648 หัวข้อ 7
แยกตัวพิมพ์เล็ก-ใหญ่ไม่ใช่

ตัวอย่าง

อินพุต (UTF-8)เอาต์พุต
Hello, World!91IMOR3F5GG5ERRIDHI22===
Base64.is89GN6P9M6GN6ISO=
你好SIUQ1PD5NK======

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

Base32 กับ Base32hex ต่างกันอย่างไร
ทั้งสองแบบใช้อักขระละ 5 บิตและกฎแพดดิงเดียวกัน Base32 มาตรฐานใช้ A-Z 2-7 ส่วน Base32hex ใช้ 0-9 A-V ซึ่งคงลำดับการเรียงของข้อมูลไว้ ทั้งสองแบบใช้แทนกันไม่ได้
Base32hex แยกตัวพิมพ์เล็ก-ใหญ่หรือไม่

ชุดตัวอักษรกำหนดเป็นตัวพิมพ์ใหญ่ แต่ตัวถอดรหัสนี้รับอินพุตตัวพิมพ์เล็กได้ด้วย เปิด “ตัวพิมพ์เล็ก” หากต้องการเอาต์พุตเป็นตัวพิมพ์เล็ก เช่น สำหรับป้ายชื่อ DNS

ควรใช้แพดดิงหรือไม่
RFC 4648 เติม = จนความยาวเป็นพหุคูณของ 8 อักขระ แต่หลายรูปแบบรวมถึง NSEC3 ละไว้ ตัวถอดรหัสรับได้ทั้งสองแบบ จึงเลือกตามที่ระบบปลายทางต้องการได้เลย
สตริง Base32hex เหมือนกับเลขฐานสิบหกหรือไม่
ไม่เหมือน สตริง Base32hex ที่บังเอิญมีเฉพาะ 0-9 และ A-F จะดูเหมือนเลขฐานสิบหก แต่อักขระแต่ละตัวเก็บข้อมูล 5 บิตแทนที่จะเป็น 4 บิต หากต้องการทำงานกับเลขฐานสิบหกทั่วไป ให้ใช้ เครื่องมือ Base16