1

XTEA で std::vector を暗号化しようとしています。std::vector を使用すると、大量のデータを扱う際にさまざまな利点が得られるので、使用したいと考えています。

XTEA アルゴリズムは、64 ビットのデータを使用する 2 つの符号なし long (v0 と v1) を使用して、それらを暗号化します。

xtea_enc(unsigned char buf[], int length, unsigned char key[], unsigned char** outbuf)
/* Source http://pastebin.com/uEvZqmUj */

unsigned long v0 = *((unsigned long*)(buf+n));  
unsigned long v1 = *((unsigned long*)(buf+n+4));

私の問題は、char ベクトルを unsigned long ポインターに変換する最良の方法を探していることです。

または、暗号化機能のためにベクトルを 64 ビット部分に分割する別の方法はありますか?

4

2 に答える 2

2

洞察は、各文字がバイトであることを理解することから得られます。したがって、64 ビット数は 8 バイトまたは 2 つの 32 ビット数で構成されます。

したがって、1 つの 32 ビット数値は 4 バイトを格納できるため、char ベクトル内の 8 バイト ブロックごとに、4 バイト数値のペアを 32 ビット数値のペアに格納します。次に、このペアを次のように xtea 関数に渡します。

uint32_t datablock[2];
datablock[0] = (buf[0] << 24) | (buf[1] << 16)  | (buf[2] << 8) | (buf[3]);
datablock[1] = (buf[4] << 24) | (buf[5] << 16)  | (buf[6] << 8) | (buf[7]);

この例では、buf は char[8] (より適切には uint8_t[8]) 型です。

ビット シフト '<<' 演算子は、特定のバイトのビットが uint32_t に格納される場所の配置をシフトします (したがって、たとえば、上記の例の最初のバイトは、datablock[0] の最初の 8 ビットに格納されます)。「|」演算子は、完全な 32 ビット数になるように、すべてのビットの連結を提供します。それが理にかなっていることを願っています。

于 2014-08-17T14:28:36.087 に答える