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

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Z85 และแปลงกลับ Z85 คือ Base85 รูปแบบที่ ZeroMQ กำหนดขึ้น โดยมีชุดตัวอักษรที่ใส่ในสตริงลิเทอรัลของซอร์สโค้ดได้โดยไม่ต้อง escape

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

วิธีใช้งาน

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

Z85 คืออะไร

Z85 กำหนดไว้ใน ZeroMQ RFC 32 (ข้อกำหนดของชุมชน ZeroMQ ไม่ใช่ RFC ของ IETF) Z85 แปลงข้อมูลทุก 4 ไบต์เป็น 5 อักขระเช่นเดียวกับการเข้ารหัส Base85 แบบอื่น โดยอ่านแต่ละกลุ่มเป็นตัวเลข 32 บิตแบบ big-endian แล้วเขียนเป็นเลขฐาน 85 ห้าหลัก เริ่มจากหลักที่มีนัยสำคัญสูงสุด เอาต์พุตใหญ่กว่าอินพุต 25%

สิ่งที่ทำให้ Z85 แตกต่างคือชุดตัวอักษร ได้แก่ 0-9, a-z, A-Z และสัญลักษณ์ 23 ตัว .-:+=^!/*?&<>()[]{}@%$# โดยไม่มีเครื่องหมายอัญประกาศทั้งสองแบบ แบ็กสแลช แบ็กทิก จุลภาค อัฒภาค เส้นตั้ง ทิลดา และขีดล่าง ชุดตัวอักษรนี้ออกแบบมาให้ใช้ในสตริงของซอร์สโค้ดได้อย่างปลอดภัย จึงวางค่า Z85 ไว้ระหว่างเครื่องหมายอัญประกาศใน C, Python หรือ JSON ได้โดยไม่ต้อง escape เลย

Z85 ใช้ที่ไหนบ้าง

ZeroMQ ใช้ Z85 เพื่อแสดงคีย์ CurveZMQ เป็นข้อความ คีย์สาธารณะหรือคีย์ลับขนาด 32 ไบต์จะกลายเป็นสตริง Z85 ยาว 40 อักขระ ซึ่งเป็นรูปแบบที่ zmq_curve_keypair() ส่งคืน และเป็นรูปแบบที่ตัวเลือกซ็อกเก็ตสำหรับความปลอดภัยแบบ CURVE รับได้ ไลบรารียังมี zmq_z85_encode() และ zmq_z85_decode() ให้ใช้ และไลบรารีสำหรับภาษาอื่น เช่น pyzmq ก็มีฟังก์ชันเดียวกันนี้

// C (libzmq)
char text[41];                       // 32 ไบต์ -> 40 อักขระ + NUL
zmq_z85_encode(text, key, 32);

# Python (pyzmq)
from zmq.utils import z85
z85.encode(bytes.fromhex('864fd26fb559f75b'))   # b'HelloWorld'

บรรทัดสุดท้ายคือเวกเตอร์ทดสอบจากข้อกำหนด

ความยาวของอินพุต: ข้อควรทราบเกี่ยวกับเครื่องมือนี้

RFC 32 กำหนดให้อินพุตไบนารีมีความยาวเป็นพหุคูณของ 4 ไบต์ และสตริงที่เข้ารหัสแล้วมีความยาวเป็นพหุคูณของ 5 อักขระ ข้อกำหนดนี้ไม่มีแพดดิง และการใช้งานแบบเข้มงวด เช่น zmq_z85_encode() จะปฏิเสธความยาวอื่น

เครื่องมือนี้รับความยาวอื่นได้ด้วย โดยใช้กฎเดียวกับ Ascii85 และ Base85 คือกลุ่มสุดท้ายที่มี n ไบต์จะกลายเป็น n + 1 อักขระ ซึ่งเป็นส่วนขยายที่ไม่เป็นไปตามมาตรฐาน เอาต์พุตที่สร้างด้วยวิธีนี้อาจถูกตัวถอดรหัส Z85 อื่นปฏิเสธ หากต้องการความเข้ากันได้ ให้เติมข้อมูลจนมีความยาวเป็นพหุคูณของ 4 ไบต์ คีย์ CurveZMQ มีขนาด 32 ไบต์จึงลงตัวเสมอ

ข้อกำหนด

ชุดตัวอักษร0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
ขนาดเอาต์พุต5 อักขระต่อ 4 ไบต์ (125%)
แพดดิงไม่มี
มาตรฐานZeroMQ RFC 32
แยกตัวพิมพ์เล็ก-ใหญ่ใช่

ตัวอย่าง

อินพุต (UTF-8)เอาต์พุต
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

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

Z85 กับ Ascii85 ต่างกันอย่างไร
การคำนวณเหมือนกัน แต่ชุดตัวอักษรต่างกัน Ascii85 ใช้ช่วง ASCII ตั้งแต่ ! ถึง u ซึ่งรวมเครื่องหมายอัญประกาศและแบ็กสแลชไว้ด้วย และมีอักขระย่อ z สำหรับไบต์ศูนย์ ส่วน Z85 หลีกเลี่ยงอักขระที่ต้อง escape ในสตริง และไม่มีอักขระย่อ
Z85 ใช้แพดดิงหรือไม่

ไม่ใช้ ข้อกำหนดอนุญาตเฉพาะอินพุตที่มีความยาวเป็นพหุคูณของ 4 ไบต์ เครื่องมือนี้เข้ารหัสความยาวอื่นโดยให้กลุ่มสุดท้ายสั้นลง ซึ่งไม่ได้เป็นส่วนหนึ่งของมาตรฐาน

ใช้ Z85 ใน JSON, XML หรือ URL ได้หรือไม่
ในสตริง JSON ได้ โดยไม่ต้อง escape ใน XML และ HTML ต้อง escape <, > และ & ส่วนใน URL นั้น Z85 ไม่เหมาะ เพราะ ?, &, / และ # มีความหมายพิเศษ ให้ใช้ Base64URL หรือ Base58 แทน
คีย์ CurveZMQ ที่เข้ารหัสเป็น Z85 ยาวเท่าใด

คีย์ CurveZMQ มีขนาด 32 ไบต์ จึงเข้ารหัสได้ 40 อักขระพอดี หากต้องการดูคีย์ดิบ ให้ถอดรหัสที่นี่โดยเลือกเอาต์พุตเป็น “เลขฐานสิบหก”