Простой способ сделать это - просто добавить CRC в форме байта к сообщению. Затем, когда вы получаете сообщение, вы вычисляете CRC всех, кроме последних 4 байтов сообщения, и сравниваете его с добавленными байтами CRC. Конечно, это немного сложнее, чем то, что вы хотите сделать, но вы можете применить эту стратегию к криптографическим хэшам, таким как MD5 или SHA.
Однако, чтобы сделать то, что вы просите, вам нужно инвертировать CRC32, вычитая его из 0xffffffff перед преобразованием его в байты &, добавляя его. CRC32 на самом деле является обратным CRC, который предотвращает получение нуля всех нулевых байтов от нуля CRC. При декодировании сообщение может быть действительным, если CRC данных + CRC равно 0xffffffff.
Питон CRC32 документы рекомендуется использовать
crc32(data) & 0xffffffff
вместо
crc32(data)
, чтобы гарантировать, что вы получите тот же числовое значение во всех версиях Python и платформ.
Вот краткое описание Python 3.
import binascii
maxcrc = 0xffffffff
def inverse_crc(data):
crc = binascii.crc32(data) & maxcrc
invcrc = maxcrc - crc
return invcrc.to_bytes(4, 'little')
def check_crc(data):
return binascii.crc32(data) & maxcrc == maxcrc
#Test
data = b"Hello, world"
newdata = data + inverse_crc(data)
print(check_crc(newdata))
newdata = b'0x00' + newdata
print(check_crc(newdata))
выход
True
False
Обратите внимание, что вы можете получить ложные срабатывания: коррумпированное сообщение может иметь правильный CRC. Если вам нужен более высокий уровень защиты, вы должны использовать криптографический хеш. Это все еще не идеально, но вероятность ложного положительного с такими крупными хэшами чрезвычайно низкая. Разумеется, вычисление хеша MD5 или SHA равно намного медленнее, чем вычисление CRC32.
Спасибо! Я попробую это позже сегодня надеемся :) – ViggoTW