Điều đó hoàn toàn phụ thuộc vào ý bạn là "thông báo". Nếu bạn có thể thêm bốn byte vô nghĩa vào một trong các thư. (I.E. bốn byte không có ý nghĩa trong ngữ cảnh của thông điệp.) Sau đó, nó trở nên tầm thường theo nghĩa chân thật nhất của từ đó.
Suy nghĩ về các bit di chuyển qua máy trạng thái CRC32.
CRC32 dựa trên thanh ghi thay đổi phản hồi galois, mỗi bit trong trạng thái của nó sẽ được thay thế bằng cảm ứng 32 bit từ dữ liệu tải trọng. Tại thời điểm cảm ứng của từng bit, các vị trí được chỉ thị bởi đa thức sẽ là độc quyền với chuỗi được quan sát từ cuối thanh ghi Shift. Trình tự này không bị ảnh hưởng bởi dữ liệu đầu vào cho đến khi thanh ghi thay đổi đã được lấp đầy.
Như một ví dụ, hãy tưởng tượng chúng ta có một thanh ghi dịch đầy trạng thái ban đầu 10.101.110, đa thức 10.000.011, và điền với bit không rõ, X.
Polynomial * ** |feedback (End of SR.)
State 10101110 0
State X1010111 1
State XX101000 0
State XXX10100 0
State XXXX1010 0
State XXXXX101 1
State XXXXXX01 1
State XXXXXXX1 1
State XXXXXXXX 0
Phản hồi không phải là về mặt X cho đến khi SR đã được lấp đầy! Vì vậy, để tạo ra một tin nhắn với một kiểm tra định trước, bạn có tin nhắn mới của bạn, tạo ra nó CRC và làm việc ra nó là 32 bit tiếp theo của thông tin phản hồi. Điều này bạn có thể làm trong 32 bước của hàm CRC. Sau đó, bạn cần tính toán hiệu ứng mà phản hồi này có trên nội dung của thanh ghi thay đổi.
Phím tắt để thực hiện việc này là để đệm thư của bạn với bốn byte bằng 0 và sau đó nhìn vào tổng kiểm tra. (Checksum là trạng thái của SR ở cuối, mà nếu đệm với bốn byte không là ảnh hưởng của phản hồi và các byte trống.)
Độc quyền HOẶC ảnh hưởng đến giá trị tổng kiểm tra bạn muốn, thay thế đoạn giới thiệu bốn byte bằng giá trị được tính đó và tạo lại tổng kiểm tra. Bạn có thể làm điều này với bất kỳ chương trình nào tạo CRC32, trình chỉnh sửa hex và máy tính có thể xử lý hex.
Nếu bạn muốn tạo hai thư có ý nghĩa hoàn chỉnh và không chứa dấu vết rác, mọi thứ trở nên khó khăn hơn một chút. Xác định một số phần mà bạn có thể viết các lựa chọn thay thế hợp lý, với chính xác cùng độ dài.
Sử dụng văn xuôi tiếng Anh làm ví dụ. "Tôi nghĩ rằng điều này có thể hoạt động" và "Tôi tin vào phương pháp này" Có ý nghĩa tương tự rộng và chính xác cùng độ dài.
Xác định đủ ví dụ trong thư là bit phức tạp (Trừ khi bạn muốn gian lận với khoảng trắng!) CRC 32 là tuyến tính, miễn là dữ liệu có độ lệch chính xác trong thông báo. Vì vậy, CRC ([messagea] [padding])^CRC ([padding] [messageb]) = CRC ([messagea] [messageb]) Có một số cảnh báo với sự liên kết từ mà bạn sẽ cần phải đối phó với, như một gợi ý, bạn muốn mở rộng các đoạn ra thành các phần "cố định" của tin nhắn. Theo nguyên tắc chung, bạn muốn có các lựa chọn thay thế cho n * 1.5 đoạn, trong đó n là kích thước của CRC.
Bây giờ bạn có thể tính CRC mà thông điệp xương có, ấn tượng rằng mỗi đoạn thay thế sẽ có trên đó, và sau đó vẽ lên một bảng so sánh ảnh hưởng mà mỗi thay thế cho mỗi đoạn văn sẽ có. Sau đó, bạn cần phải chọn các lựa chọn thay thế sẽ sửa đổi CRC xương để phù hợp với CRC bạn muốn. Vấn đề đó thực sự khá thú vị để giải quyết, Trước tiên hãy tìm bất kỳ lựa chọn thay thế nào mà sửa đổi một chút, nếu bit đó cần thay đổi cho CRC của bạn, hãy chọn thay thế đó và gấp ảnh hưởng của nó vào CRC, sau đó đi vòng lại. Điều đó sẽ giảm không gian giải pháp mà bạn cần tìm kiếm.
Đó là một điều khá khó khăn để mã hóa, nhưng nó sẽ tạo ra va chạm của bạn trong một khoảng thời gian rất ngắn.
OK, nhưng tôi thấy nó thú vị khi bạn nói "sửa đổi" tại chỗ. Tôi đã nghĩ CRC được thiết kế để phát hiện những sửa đổi nhỏ hơn trong các tệp/chuỗi lớn hơn vì nó được sử dụng để kiểm tra tính toàn vẹn. –
Đó là vấn đề. CRC rất nhanh để tính toán và phát hiện các thay đổi ngẫu nhiên, không phải lúc chịu được sự giải mã. –