Tính tổng kiểm tra CRC32

Tính tổng kiểm tra CRC-32 hoặc CRC-32C của văn bản, byte hex hoặc cả một tệp, hiển thị ở dạng hex, thập phân hoặc Base64 và so sánh với giá trị mong đợi. Tệp được đọc cục bộ và không bao giờ bị tải lên.

Tất cả thuật toán

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. Nhập hoặc dán văn bản, chuyển Đầu vào dạng sang Hex để nhập byte thô, hoặc nhấp Mở tệp để tính tổng kiểm tra cho nội dung của tệp.
  2. Giữ CRC-32 trong ô Thuật toán cho ZIP, gzip và PNG, hoặc chọn CRC-32C cho iSCSI, ext4, Btrfs và Google Cloud Storage.
  3. Ở mục Đầu ra dạng, chọn hex (chữ thường), HEX (chữ hoa), Thập phân hoặc Base64.
  4. Để kiểm tra, hãy dán tổng kiểm tra mong đợi vào ô So sánh với, ở dạng hex không có 0x, dạng thập phân hoặc Base64.

Tổng kiểm tra CRC32 là gì

Kiểm tra dư thừa vòng (cyclic redundancy check, CRC) coi dữ liệu đầu vào như một đa thức nhị phân rất dài, chia nó cho một đa thức sinh cố định và giữ lại phần dư. Với CRC-32, phần dư dài 32 bit, thường được viết thành 8 chữ số hex hoặc một số không dấu từ 0 đến 4.294.967.295. Gần như mọi thay đổi trên dữ liệu đều làm phần dư thay đổi.

CRC được thiết kế cho những lỗi mà cáp, sóng vô tuyến và ổ đĩa ngoài thực tế gây ra. CRC-32 phát hiện mọi chuỗi bit lỗi liên tiếp (burst) dài tới 32 bit, và một lỗi ngẫu nhiên chỉ lọt qua khoảng một lần trong 4,3 tỷ trường hợp. CRC-32 cũng được tính rất nhanh, đó là lý do nó được tích hợp sẵn trong ZIP, gzip, PNG và khung Ethernet.

CRC-32 và CRC-32C

CRC-32CRC-32C (Castagnoli)
Đa thức0x04C11DB7, đảo thứ tự bit thành 0xEDB883200x1EDC6F41, đảo thứ tự bit thành 0x82F63B78
Giá trị kiểm tra của 123456789cbf43926e3069283
Được dùng trongZIP, gzip, PNG, EthernetiSCSI, SCTP, siêu dữ liệu ext4, Btrfs, Google Cloud Storage
Hỗ trợ phần cứngLệnh CRC32 của ARMv8Lệnh crc32 của x86 SSE4.2, ARMv8

Cả hai đều bắt đầu từ 0xFFFFFFFF, xử lý các bit của mỗi byte từ bit có trọng số thấp nhất trước và đảo tất cả các bit của giá trị cuối cùng; chỉ có đa thức là khác nhau, nên cùng một dữ liệu sẽ cho ra hai kết quả không liên quan gì đến nhau. Biến thể thứ nhất là thứ mà hầu hết các công cụ gọi là "CRC32" và được ghi trong danh mục với tên CRC-32/ISO-HDLC. CRC-32C về sau được các giao thức lưu trữ và mạng áp dụng nhờ khả năng phát hiện lỗi tốt hơn. Google Cloud Storage báo cáo CRC-32C, còn Amazon S3 báo cáo một trong hai biến thể, ở dạng Base64 của bốn byte theo thứ tự big-endian, đúng như những gì đầu ra Base64 hiển thị.

Tổng kiểm tra, không phải biện pháp bảo mật

CRC bảo vệ trước sự cố ngẫu nhiên, không phải trước tấn công. Đây là một hàm tuyến tính, nên bất kỳ ai cũng có thể sửa một tệp rồi điều chỉnh bốn byte để giữ nguyên CRC-32 của nó. Vì vậy, CRC khớp không chứng minh được điều gì về việc dữ liệu có bị cố ý can thiệp hay không. Để kiểm tra tệp tải về, hãy so sánh mã băm SHA-256 lấy từ nguồn đáng tin cậy; để chứng minh ai đã gửi một thông điệp, hãy dùng HMAC.

32 bit cũng quá ít để định danh dữ liệu. Chỉ trong khoảng 77.000 tệp ngẫu nhiên, xác suất có hai tệp trùng CRC-32 đã lên tới 50%, vì vậy đừng dùng nó làm ID duy nhất hay làm khóa để loại bỏ trùng lặp. Ở những nơi không có kẻ tấn công, MD5 hoặc SHA-256 là dấu vân tay tốt hơn nhiều.

CRC32 trong mã nguồn

# Python: zlib.crc32 trả về số không dấu trong Python 3;
# "& 0xffffffff" chỉ cần cho Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x')    # 'cbf43926'

// Node.js 20.15+ và 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0')   // 'cbf43926'

// Go (import "hash/crc32")
crc32.ChecksumIEEE(data)                                   // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli))    // CRC-32C

// Java: java.util.zip.CRC32, và java.util.zip.CRC32C từ Java 9

// PHP
sprintf('%08x', crc32('123456789'));   // 'cbf43926'
hash('crc32b', '123456789');           // 'cbf43926', cùng là CRC-32
hash('crc32c', '123456789');           // 'e3069283'
hash('crc32', '123456789');            // '181989fc', một CRC khác

Hãy chú ý tên gọi trong PHP: thuật toán băm có tên crc32 không phải là tổng kiểm tra của ZIP mà là CRC của bzip2, được in theo thứ tự byte đảo ngược. Hãy dùng crc32b hoặc hàm crc32() để khớp với ZIP, gzip và công cụ này. Lệnh Unix cksum lại dùng thêm một biến thể khác nữa, có trộn cả độ dài tệp vào, nên con số của nó cũng không khớp với hai biến thể trên.

Ví dụ

Đầu vào (UTF-8)CRC-32
Hello, World!ec4ac3d0
Base64.is915d7207
你好50a2b841

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

CRC32 của "123456789" là bao nhiêu?
Chuỗi này là đầu vào kiểm thử tiêu chuẩn cho các thuật toán CRC. CRC-32 của nó là cbf43926 (3421780262 ở hệ thập phân) và CRC-32C là e3069283. Nếu bản cài đặt của bạn trả về đúng các giá trị này, nó dùng cùng tham số với công cụ này.
Vì sao CRC32 của tôi khác với công cụ khác?
Hãy kiểm tra bốn điều: biến thể (CRC-32, CRC-32C, CRC của bzip2 và cksum của POSIX đều cho kết quả khác nhau), byte đầu vào (kiểu xuống dòng, ký tự xuống dòng thừa ở cuối, bảng mã văn bản), định dạng số (một số ngôn ngữ trả về số nguyên 32 bit có dấu, khiến các giá trị lớn thành số âm) và thứ tự byte.
Vì sao các byte CRC bị đảo ngược bên trong tệp ZIP hoặc gzip của tôi?
ZIP và gzip lưu CRC-32 theo thứ tự byte little-endian, nên trình soạn thảo hex hiển thị bốn byte theo thứ tự ngược so với cách viết thông thường. PNG lưu theo big-endian. Công cụ này, unzip -v và hầu hết các chương trình khác đều in byte có trọng số cao nhất trước.
Có thể tính CRC32 của tệp lớn không?

Có. Nhấp Mở tệp, tổng kiểm tra sẽ được tính từ các byte của tệp ngay trên thiết bị của bạn mà không cần tải tệp lên; mọi tệp mà trình duyệt chứa được trong bộ nhớ đều dùng được. Sau đó bạn có thể so sánh kết quả với giá trị trong tệp SFV hoặc trong danh sách tệp của một tệp ZIP.

CRC32 có phải là hàm băm không?

CRC32 ánh xạ dữ liệu có độ dài bất kỳ thành một giá trị 32 bit cố định, nên thường được xếp chung với các hàm băm, nhưng nó là tổng kiểm tra: nó phát hiện lỗi ngẫu nhiên và không bảo vệ được trước người cố ý thay đổi dữ liệu. Khi cần dấu vân tay mạnh hơn, bảng Tất cả thuật toán bên dưới kết quả hiển thị MD5 và họ SHA cho cùng đầu vào.