Công cụ mã hóa và giải mã Z85

Chuyển văn bản, byte hex hoặc tệp sang Z85 và ngược lại. Z85 là biến thể Base85 do ZeroMQ định nghĩa, với bảng ký tự đặt vừa trong chuỗi ký tự của mã nguồn mà không cần thoát ký tự.

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. Chọn Mã hóa để chuyển văn bản hoặc byte sang Z85, hoặc Giải mã để chuyển Z85 trở lại thành dữ liệu.
  2. Với khóa và các giá trị nhị phân khác, hãy đặt đầu vào là Hex khi mã hóa, hoặc đầu ra là Hex khi giải mã.
  3. Nhập, dán hoặc mở một tệp. Kết quả được cập nhật ngay khi bạn gõ.
  4. Sao chép kết quả hoặc tải xuống dưới dạng tệp.

Z85 là gì?

Z85 được đặc tả trong ZeroMQ RFC 32 (một đặc tả của cộng đồng ZeroMQ, không phải RFC của IETF). Giống các kiểu mã hóa Base85 khác, nó biến mỗi 4 byte thành 5 ký tự, đọc mỗi nhóm như một số 32 bit big-endian và viết nó thành 5 chữ số cơ số 85, chữ số có trọng số lớn nhất đứng trước. Đầu ra lớn hơn đầu vào 25%.

Điểm làm Z85 khác biệt là bảng ký tự của nó: 0-9, a-z, A-Z và 23 ký hiệu .-:+=^!/*?&<>()[]{}@%$#. Bảng này loại bỏ cả hai loại dấu nháy, dấu gạch chéo ngược, dấu backtick, dấu phẩy, dấu chấm phẩy, dấu gạch đứng, dấu ngã và dấu gạch dưới. Bảng ký tự được thiết kế để an toàn trong chuỗi ký tự của mã nguồn, nên một giá trị Z85 có thể được dán giữa hai dấu nháy trong C, Python hay JSON mà không cần thoát ký tự nào.

Z85 được dùng ở đâu

ZeroMQ dùng Z85 để in khóa CurveZMQ. Một khóa công khai hoặc khóa bí mật 32 byte trở thành một chuỗi Z85 dài 40 ký tự, đây là dạng được zmq_curve_keypair() trả về và được các tùy chọn socket cho bảo mật CURVE chấp nhận. Thư viện cũng cung cấp zmq_z85_encode() và zmq_z85_decode(), và các thư viện liên kết như pyzmq có các hàm tương tự.

// C (libzmq)
char text[41];                       // 32 byte -> 40 ký tự + NUL
zmq_z85_encode(text, key, 32);

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

Dòng cuối là vectơ kiểm thử lấy từ đặc tả.

Độ dài đầu vào: lưu ý về công cụ này

RFC 32 yêu cầu dữ liệu nhị phân đầu vào phải là bội số của 4 byte và chuỗi đã mã hóa phải là bội số của 5 ký tự. Đặc tả không định nghĩa phần đệm, và các bản triển khai nghiêm ngặt như zmq_z85_encode() từ chối các độ dài khác.

Công cụ này cũng chấp nhận các độ dài khác, theo cùng quy tắc với Ascii85 và Base85: nhóm cuối gồm n byte trở thành n + 1 ký tự. Đây là một phần mở rộng không theo tiêu chuẩn. Đầu ra tạo theo cách này có thể bị các bộ giải mã Z85 khác từ chối, vì vậy hãy đệm dữ liệu cho đủ bội số của 4 byte khi bạn cần tính tương thích. Khóa CurveZMQ dài 32 byte nên luôn phù hợp.

Đặc tả

Bảng ký tự0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Kích thước đầu ra5 ký tự cho mỗi 4 byte (125%)
Phần đệmKhông có
Tiêu chuẩnZeroMQ RFC 32
Phân biệt hoa thườngCó

Ví dụ

Đầu vào (UTF-8)Đầu ra
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

Câu hỏi thường gặp

Z85 và Ascii85 khác nhau thế nào?
Phép tính giống nhau, còn bảng ký tự thì không. Ascii85 dùng dải ASCII từ ! đến u, trong đó có các dấu nháy và dấu gạch chéo ngược, và có cách viết tắt z cho các byte 0. Z85 tránh các ký tự cần thoát trong chuỗi và không có cách viết tắt nào.
Z85 có dùng phần đệm không?

Không. Đặc tả chỉ cho phép độ dài đầu vào là bội số của 4 byte. Công cụ này mã hóa các độ dài khác bằng một nhóm cuối ngắn hơn, điều không thuộc tiêu chuẩn.

Tôi có thể dùng Z85 trong JSON, XML hoặc URL không?
Trong chuỗi JSON thì được, không cần thoát ký tự. Trong XML và HTML, <, > và & phải được thoát. Z85 không phù hợp với URL vì ?, &, / và # có ý nghĩa đặc biệt; hãy dùng Base64URL hoặc Base58 thay thế.
Khóa CurveZMQ khi mã hóa Z85 dài bao nhiêu?

Khóa CurveZMQ dài 32 byte, nên được mã hóa thành đúng 40 ký tự. Để xem khóa thô, hãy giải mã nó tại đây với đầu ra Hex.