Chọn Mã hóa hoặc Giải mã, chọn sơ đồ và nhấn nút thao tác. Mọi xử lý đều ở trong trình duyệt của bạn.
Base32 và Base58 là gì?
Chúng là hai câu trả lời cho một câu hỏi: một kênh mang văn bản được yêu cầu mang các byte. Base32 và Base58 không phải là mã hóa và không phải là băm — chúng không giấu gì và cũng không làm ngắn đi điều gì. Chúng viết lại một chuỗi byte bằng một tập ký tự dễ đọc cố định, và bất kỳ ai biết tập nào đã được dùng đều có thể đổi ngược ngay. Lý do duy nhất để chọn cái này thay cái kia là đầu nhận sẽ làm gì với các ký tự.
Hai họ thực hiện việc viết lại đó theo những cách hoàn toàn khác nhau, và sự khác biệt giải thích gần như mọi điều bất ngờ trên trang này:
- Đóng gói bit — Base32, Base32 Hex, Crockford Base32, z-base-32. Các byte được cắt thành nhóm cố định và cứ mỗi năm bit thành một ký tự. Độ dài đầu ra dự đoán được từ độ dài đầu vào, và nhóm cuối cùng chưa đầy được đánh dấu bằng ký tự đệm hoặc để ngắn.
- Chuyển đổi số lớn — mọi bảng Base58. Toàn bộ chuỗi byte được đọc như một số khổng lồ trong cơ số 256 rồi viết lại trong cơ số 58. Không có nhóm và không có đệm; độ dài không chia hết cho đơn vị nào, và mỗi byte 0 đứng đầu trở thành một ký hiệu 0 đứng đầu.
Sáu bit mang dữ liệu được phân bố thế nào: Base32 dùng năm bit mỗi ký tự, nên cần tám ký tự cho mỗi năm byte đầu vào — lớn hơn khoảng 60%. Base58 dùng khoảng 5,86 bit mỗi ký tự, nên lớn hơn khoảng 37%. Base64 mã hóa sáu bit mỗi ký tự và lớn hơn 33%. Bảng chữ cái lớn hơn thì chuỗi ngắn hơn nhưng khó đọc to hơn — đó chính là sự đánh đổi mà mỗi bảng chọn.
Bảy bảng chữ cái trên trang này
Mỗi bảng chữ cái được in đầy đủ thay vì chỉ mô tả, vì hai công cụ in các ký tự khác nhau dưới cùng một tên sẽ không thống nhất với nhau dù nhãn có ghi gì đi nữa. Các dòng RFC 4648 là chuẩn; các dòng Crockford và z-base-32 theo những gì tác giả định dạng công bố; ba dòng Base58 là các quy ước phổ biến chứ không phải tiêu chuẩn, đó là lý do chúng được liệt kê riêng.
Crockford Base32 và ký tự kiểm tra modulo 37
Bảng chữ cái bỏ I, L, O và U để không ký hiệu nào có thể bị đọc thành ký hiệu khác. Phần còn lại không phân biệt hoa thường khi nhập: i và l được đọc là chữ số 1, o được đọc là chữ số 0, và dấu gạch ngang chỉ để chuỗi dài dễ đọc hơn. Ngoài ra định dạng còn quy định một ký tự kiểm tra tùy chọn, là giá trị của chuỗi ký hiệu đọc như một số cơ số 32, lấy modulo 37, và được viết bằng năm ký hiệu thêm cho các giá trị từ 32 đến 36.
Ký tự kiểm tra được tính trên chuỗi ký hiệu, không phải trên các byte: vì bộ mã hóa thêm số 0 vào nhóm cuối, giải mã cùng các ký tự luôn cho về cùng một giá trị. Đó là lý do giá trị kiểm tra trong bảng có thể được tái tạo bằng tay chỉ từ cột đã mã hóa. Năm ký hiệu thêm là *, ~, $, = và U ứng với các giá trị 32, 33, 34, 35 và 36, nên ký tự kiểm tra không phải lúc nào cũng là chữ số hoặc chữ cái.
z-base-32
z-base-32 giữ cách đóng gói năm bit của Base32 RFC 4648 và chỉ thay đổi thứ tự của ba mươi hai ký tự. Thứ tự được chọn để các ký tự người ta có khả năng phải viết ra nhiều nhất là những ký tự dễ viết nhất và khó nhầm nhất. Nó không có đệm, nên người đọc phải biết một giá trị được mong đợi có bao nhiêu ký hiệu; đó là cái giá của một định dạng được thiết kế để con người đọc bằng tay trước tiên.
Base58Check: một byte phiên bản, phần tải, bốn byte kiểm tra
Riêng Base58 không có cách nào phân biệt chuỗi gõ sai với chuỗi đúng, vì hầu như mọi tổ hợp năm mươi tám ký tự của nó đều là một số hợp lệ. Base58Check khắc phục điều này bằng cách đặt dữ liệu vào một lớp bọc: một byte phiên bản, rồi phần tải, rồi bốn byte đầu của SHA-256 áp dụng hai lần lên hai phần đầu. Chương trình nhận tính lại bốn byte đó và từ chối chuỗi khi chúng khác nhau. Byte phiên bản cho ví biết nó đang xem địa chỉ thanh toán, địa chỉ script hay khóa riêng.
Bộ sinh bên dưới bộ chuyển đổi nhận byte phiên bản và phần tải dưới dạng thập lục phân rồi ghi ra chuỗi Base58Check; bộ xác minh đọc lại một chuỗi, tách bốn byte kiểm tra, tính lại chúng và báo cả giá trị tìm thấy lẫn giá trị mong đợi. Tổng kiểm tra sai ở đây nghĩa là chuỗi đã bị gõ sai hoặc bị thay đổi — nó không bao giờ có nghĩa là phần tải sai, vì phần tải không bao giờ được diễn giải.
Những hiểu lầm thường gặp
- "Base64 là mã hóa." Không. Không có khóa và không có bí mật; đầu ra có thể đảo ngược bởi bất kỳ ai. Base32 và Base58 cũng vậy, và chuyển một giá trị qua cả ba cũng không thêm bảo vệ nào.
- "Chuỗi Base58 là một địa chỉ Bitcoin." Chỉ khi nó cũng vượt qua tổng kiểm tra Base58Check và mang một byte phiên bản mà phần mềm nhận nhận ra. Chuỗi Base58 xuất hiện ở nhiều nơi khác, kể cả các định danh thường không có tổng kiểm tra.
- "Ba bảng Base58 có thể thay thế cho nhau." Chúng dùng cùng năm mươi tám ký tự nhưng theo ba thứ tự khác nhau, nên cùng một chuỗi byte cho ra ba chuỗi khác nhau. Công cụ phải được chỉ định bảng nào để dùng, và trang này luôn nói rõ bảng nó đã dùng.
- "Phần đệm là một phần của giá trị." Các ký tự
= chỉ đánh dấu nhóm cuối cùng. Hai chuỗi Base32 chỉ khác nhau ở phần đệm mô tả cùng các byte, đó là lý do bộ giải mã chấp nhận chuỗi đã bị cắt bỏ phần đệm. - "Ký tự nào cũng được." Mỗi bảng chữ cái là một tập cố định. Một ký tự nằm ngoài tập đó không có giá trị, nên bộ giải mã dừng lại và nêu rõ ký tự cùng vị trí của nó thay vì đoán.
Các câu hỏi thường gặp
Vì sao Base32 dùng 2-7 chứ không phải 0-9? Vì RFC 4648 chọn bảng chữ cái sao cho nó nằm trong các ký tự được phép trong tên miền, và dễ đọc to. Base32 Hex dùng 0-9 A-V thay thế khi việc sắp xếp tự nhiên quan trọng hơn.
Vì sao chuỗi Base58 thường bắt đầu bằng 1? Mỗi byte 0 đứng đầu của đầu vào trở thành một 1 đứng đầu (ký tự đầu của bảng Bitcoin và Flickr). Byte phiên bản 0x00 là một byte 0, nên hầu hết địa chỉ Bitcoin mainnet bắt đầu đúng bằng một 1.
Nút Mẫu tải gì? Ví dụ thuộc về sơ đồ và hướng đang hiển thị trên màn hình, không bao giờ là một văn bản cố định. Bộ mã hóa nhận văn bản ví dụ của chính sơ đồ đó — các vector trong mục 10 của RFC 4648 cho Base32 và Base32 Hex, 12345 của Crockford, các dòng z-base-32 in ở trên — còn bộ giải mã nhận chuỗi đã mã hóa của bảng chữ cái được chọn, và đó là điều làm mẫu dùng được theo cả hai chiều. Ba dòng Base58 cố ý mang cùng một văn bản, nên khi đổi sơ đồ và nhấn Mẫu lại, bạn sẽ thấy ba thứ tự của cùng năm mươi tám ký tự đặt cạnh nhau. Khi đánh dấu ký tự kiểm tra Crockford, bộ giải mã nhận giá trị có ký hiệu ở cuối, và đó là cách duy nhất để xem bộ xác minh chấp nhận một ký hiệu.
Trang này có gửi dữ liệu của tôi đi đâu không? Không. Mọi chuyển đổi diễn ra trong tab trình duyệt này, và trang không chứa bất kỳ lệnh gọi mạng nào. Đó cũng là lý do trang hoạt động khi mở trực tiếp tệp từ đĩa.
Nên dùng cái nào cho bí mật? Các khóa bí mật của ứng dụng xác thực TOTP và HOTP thường là Base32 theo bảng RFC 4648, vì khóa phải được gõ bằng tay. Hãy dùng cái mà phần mềm nhận yêu cầu, và đừng bao giờ dựa vào chính việc mã hóa để giữ bí mật.