ReflectIn
実装し忘れていたZIPの暗号化をやっています。
鍵の更新処理にCRC-32が使われているのですが、その初期化でハマリました。
Boost.CRCでの概要はこうです。
template < std::size_t Bits, impl_def TruncPoly = 0u, impl_def InitRem = 0u, impl_def FinalXor = 0u, bool ReflectIn = false, bool ReflectRem = false > class crc_optimal; typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true> crc_32_type;
ZIPの仕様書によると、初期値は305419896(=0x12345678)と878082192(=0x34567890)なので、単純に、
boost::crc_32_type key0(0x12345678); boost::crc_32_type key2(0x34567890);
とすればよいように思えます。
ところがReflectIn=trueの場合、初期値もビット逆転しなくてはいけません。
また、FinalXorもいらないので、
typedef boost::crc_optimal<32,0x04C11DB7,0,0,true,true> crc_type; crc_type key0(0x1E6A2C48); crc_type key2(0x091E6A2C);
となります。
逆転すると、シークエンスが崩れるのがなんか嫌です。
ちなみに、TruncPolyもビット逆転した値です。