2016-06-27 3 views
1

MCUからコンピュータに複数のメッセージを送信していますが、32ビットの巡回冗長検査を使用してメッセージが正しいことを確認します。私が読んだところでは、最後のメッセージにCRCの余りを追加し、それをCRC関数を通して実行することが可能でなければなりません。メッセージにエラーがない場合は、ゼロを返します。 binasciiライブラリ関数binascii.crc32()を使用してこれを実装するのに失敗しました。binascii.crc32()を使用してチェックサムを検証する

たとえば、Pythonのドキュメント(私はPython 3.5を使用しています)で与えられた例から内部的にメッセージをチェックしたいとしましょう。メッセージにエラーがないかどうかを確認するにはどうしたらいいですか(この例ではもちろんですか)。

crc = binascii.crc32(b"hello") 
crc = binascii.crc32(b" world", crc) 

check_for_error() # <--- ? 

答えて

1

簡単な方法は、バイト形式の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を計算するよりも遅く、です。

+0

ありがとうございました!私は今日このことをうまく試してみる:) – ViggoTW

関連する問題