簡単な方法は、バイト形式のCRCをメッセージに追加することです。その後、メッセージを受信すると、メッセージの最後の4バイトを除くすべてのCRCを計算し、追加されたCRCバイトと比較します。確かに、それはあなたがやりたいことよりもはるかに面倒ですが、その戦略をMD5やSHAファミリのような暗号化ハッシュに適用することができます。
しかし、CRC32を0xffffffffから差し引くことによってそれを逆転させてから、バイトを&に追加する必要があります。 CRC32は、実際には逆CRCであり、すべてのゼロバイトのメッセージがゼロCRCを有することを防止する。デコード時に、データ+ CRCのCRCが0xffffffffに等しい場合、メッセージはとなる可能性があります。
ザ・パイソンCRC32のドキュメントは、あなたがすべてのPythonのバージョンとプラットフォーム間で同じ数値を得ることを保証するために
crc32(data) & 0xffffffff
ではなく
crc32(data)
を使用することをお勧めします。
ここでは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