เครื่องคำนวณเช็กซัม CRC32

คำนวณเช็กซัม CRC-32 หรือ CRC-32C ของข้อความ ไบต์เลขฐานสิบหก หรือทั้งไฟล์ แสดงเป็น hex เลขฐานสิบ หรือ Base64 และเปรียบเทียบกับค่าที่คาดไว้ ไฟล์จะถูกอ่านภายในเครื่องและไม่มีการอัปโหลด

อัลกอริทึมทั้งหมด

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

วิธีใช้งาน

  1. พิมพ์หรือวางข้อความ ตั้ง “รูปแบบอินพุต” เป็น “เลขฐานสิบหก” เพื่อป้อนไบต์ดิบ หรือคลิก “เปิดไฟล์” เพื่อคำนวณเช็กซัมของเนื้อหาไฟล์
  2. ที่ “อัลกอริทึม” ให้คง CRC-32 ไว้สำหรับไฟล์ ZIP, gzip และ PNG หรือเลือก CRC-32C สำหรับงานที่เกี่ยวกับ iSCSI, ext4, Btrfs และ Google Cloud Storage
  3. เลือกเอาต์พุตเป็น “hex (ตัวพิมพ์เล็ก)” “HEX (ตัวพิมพ์ใหญ่)” “เลขฐานสิบ” หรือ Base64
  4. หากต้องการตรวจสอบ ให้วางเช็กซัมที่คาดไว้ลงในช่อง “เปรียบเทียบกับ” โดยป้อนเป็นเลขฐานสิบหกที่ไม่มี 0x เป็นเลขฐานสิบ หรือเป็น Base64

เช็กซัม CRC32 คืออะไร

การตรวจสอบความซ้ำซ้อนแบบวนรอบ (cyclic redundancy check) จะมองอินพุตเป็นพหุนามไบนารียาวหนึ่งตัว นำไปหารด้วยพหุนามตัวกำเนิดที่กำหนดไว้ตายตัว แล้วเก็บเศษไว้ สำหรับ CRC-32 เศษจะมีขนาด 32 บิต มักเขียนเป็นเลขฐานสิบหก 8 หลัก หรือเป็นจำนวนเต็มไม่มีเครื่องหมายตั้งแต่ 0 ถึง 4,294,967,295 การเปลี่ยนแปลงข้อมูลแทบทุกรูปแบบจะทำให้เศษเปลี่ยนไป

CRC ถูกออกแบบมาสำหรับข้อผิดพลาดที่เกิดขึ้นจริงจากสายเคเบิล คลื่นวิทยุ และดิสก์ CRC-32 ตรวจจับบิตที่เสียหายติดกันเป็นช่วง (burst) ที่ยาวไม่เกิน 32 บิตได้ทุกกรณี และความเสียหายแบบสุ่มจะหลุดรอดไปได้เพียงราวหนึ่งครั้งในทุก 4,300 ล้านกรณี นอกจากนี้ยังคำนวณได้เร็วมาก จึงถูกฝังไว้ใน ZIP, gzip, PNG และเฟรม Ethernet

CRC-32 และ CRC-32C

CRC-32CRC-32C (Castagnoli)
พหุนาม0x04C11DB7 แบบกลับลำดับบิตคือ 0xEDB883200x1EDC6F41 แบบกลับลำดับบิตคือ 0x82F63B78
ค่าตรวจสอบของ 123456789cbf43926e3069283
ใช้ในZIP, gzip, PNG, EthernetiSCSI, SCTP, เมทาดาทาของ ext4, Btrfs, Google Cloud Storage
การรองรับในฮาร์ดแวร์คำสั่ง CRC32 ของ ARMv8คำสั่ง crc32 ของ x86 SSE4.2, ARMv8

ทั้งสองแบบเริ่มต้นจาก 0xFFFFFFFF ประมวลผลบิตของแต่ละไบต์โดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุด และกลับค่าบิตของผลลัพธ์สุดท้าย ต่างกันเพียงพหุนามเท่านั้น ข้อมูลเดียวกันจึงให้ผลลัพธ์สองค่าที่ไม่เกี่ยวข้องกันเลย แบบแรกคือสิ่งที่เครื่องมือส่วนใหญ่หมายถึงเมื่อพูดว่า "CRC32" และถูกจัดอยู่ในแค็ตตาล็อกในชื่อ CRC-32/ISO-HDLC ส่วน CRC-32C ถูกนำมาใช้ภายหลังในโปรโตคอลด้านการจัดเก็บข้อมูลและเครือข่าย เพราะตรวจจับข้อผิดพลาดได้ดีกว่า Google Cloud Storage รายงาน CRC-32C และ Amazon S3 รายงานได้ทั้งสองแบบ ในรูป Base64 ของสี่ไบต์ที่เรียงลำดับแบบ big-endian ซึ่งตรงกับที่เอาต์พุต Base64 แสดงทุกประการ

เช็กซัม ไม่ใช่การตรวจสอบด้านความปลอดภัย

CRC ป้องกันความผิดพลาดที่เกิดโดยบังเอิญ ไม่ใช่การโจมตี CRC เป็นฟังก์ชันเชิงเส้น ใครก็ตามจึงแก้ไขไฟล์แล้วปรับค่าสี่ไบต์เพื่อให้ CRC-32 คงเดิมได้ CRC ที่ตรงกันจึงพิสูจน์ไม่ได้เลยว่าไฟล์ไม่ถูกดัดแปลงโดยเจตนา หากต้องการตรวจสอบไฟล์ที่ดาวน์โหลด ให้เปรียบเทียบแฮช SHA-256 จากแหล่งที่เชื่อถือได้ และหากต้องการพิสูจน์ว่าใครเป็นผู้ส่งข้อความ ให้ใช้ HMAC

32 บิตยังน้อยเกินไปที่จะใช้ระบุข้อมูลแต่ละชุด ในไฟล์สุ่มราว 77,000 ไฟล์ โอกาสที่จะมีสองไฟล์ที่มี CRC-32 เดียวกันก็สูงถึง 50% แล้ว จึงไม่ควรใช้เป็น ID ที่ไม่ซ้ำกันหรือคีย์สำหรับตัดข้อมูลซ้ำ ในกรณีที่ไม่มีผู้โจมตีเกี่ยวข้อง MD5 หรือ SHA-256 เป็นลายนิ้วมือของข้อมูลที่ดีกว่ามาก

CRC32 ในโค้ด

# Python: zlib.crc32 ใน Python 3 คืนค่าแบบไม่มีเครื่องหมาย
# ต้องใช้ "& 0xffffffff" เฉพาะใน Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x')    # 'cbf43926'

// Node.js 20.15+ และ 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 และ java.util.zip.CRC32C ตั้งแต่ Java 9

// PHP
sprintf('%08x', crc32('123456789'));   // 'cbf43926'
hash('crc32b', '123456789');           // 'cbf43926' คือ CRC-32 ตัวเดียวกัน
hash('crc32c', '123456789');           // 'e3069283'
hash('crc32', '123456789');            // '181989fc' เป็น CRC คนละแบบ

ระวังเรื่องชื่อใน PHP อัลกอริทึมแฮชที่ชื่อ crc32 ไม่ใช่เช็กซัมของ ZIP แต่เป็น CRC ที่ bzip2 ใช้ และแสดงผลในลำดับไบต์ที่กลับด้าน ให้ใช้ crc32b หรือฟังก์ชัน crc32() เพื่อให้ตรงกับ ZIP, gzip และเครื่องมือนี้ ส่วนคำสั่ง cksum ของ Unix ใช้อีกรูปแบบหนึ่งที่นำความยาวของไฟล์มาคำนวณด้วย ตัวเลขที่ได้จึงไม่ตรงกับทั้งสองแบบ

ตัวอย่าง

อินพุต (UTF-8)CRC-32
Hello, World!ec4ac3d0
Base64.is915d7207
你好50a2b841

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

CRC32 ของ "123456789" คือเท่าใด
สตริงนี้เป็นอินพุตทดสอบมาตรฐานของอัลกอริทึม CRC ค่า CRC-32 ของสตริงนี้คือ cbf43926 (3421780262 ในเลขฐานสิบ) และ CRC-32C คือ e3069283 หากโค้ดที่คุณเขียนเองให้ค่าเหล่านี้ แสดงว่าใช้พารามิเตอร์เดียวกับเครื่องมือนี้
ทำไม CRC32 ของฉันจึงต่างจากเครื่องมืออื่น
ให้ตรวจสอบสี่อย่าง ได้แก่ รูปแบบของ CRC (CRC-32, CRC-32C, CRC ของ bzip2 และ cksum ของ POSIX ล้วนให้ผลต่างกัน) ไบต์ของอินพุต (การจบบรรทัด อักขระขึ้นบรรทัดใหม่ต่อท้าย การเข้ารหัสอักขระ) รูปแบบตัวเลข (บางภาษาคืนค่าเป็นจำนวนเต็ม 32 บิตแบบมีเครื่องหมาย ทำให้ค่าที่มากกลายเป็นค่าลบ) และลำดับไบต์
ทำไมไบต์ของ CRC ในไฟล์ ZIP หรือ gzip จึงกลับด้าน
ZIP และ gzip จัดเก็บ CRC-32 ในลำดับไบต์แบบ little-endian โปรแกรมแก้ไขเลขฐานสิบหกจึงแสดงสี่ไบต์กลับด้านเมื่อเทียบกับรูปแบบที่เขียนกันทั่วไป ส่วน PNG จัดเก็บแบบ big-endian เครื่องมือนี้ unzip -v และโปรแกรมอื่นส่วนใหญ่จะแสดงไบต์ที่มีนัยสำคัญมากที่สุดก่อน
คำนวณ CRC32 ของไฟล์ขนาดใหญ่ได้หรือไม่

ได้ คลิก “เปิดไฟล์” แล้วเช็กซัมจะคำนวณจากไบต์ของไฟล์บนอุปกรณ์ของคุณโดยไม่มีการอัปโหลด ใช้ได้กับทุกไฟล์ที่เบราว์เซอร์โหลดไว้ในหน่วยความจำได้ จากนั้นคุณสามารถเปรียบเทียบผลลัพธ์กับค่าในไฟล์ SFV หรือในรายการไฟล์ของ ZIP

CRC32 เป็นฟังก์ชันแฮชหรือไม่

CRC32 แปลงข้อมูลความยาวเท่าใดก็ได้เป็นค่าขนาดคงที่ 32 บิต จึงมักถูกจัดรวมไว้กับแฮช แต่ CRC32 คือเช็กซัม ซึ่งตรวจจับข้อผิดพลาดที่เกิดโดยไม่ตั้งใจ และไม่ได้ป้องกันผู้ที่จงใจเปลี่ยนแปลงข้อมูล เมื่อต้องการลายนิ้วมือของข้อมูลที่แข็งแกร่งกว่า ตาราง “อัลกอริทึมทั้งหมด” ใต้ผลลัพธ์จะแสดง MD5 และตระกูล SHA ของอินพุตเดียวกัน