1

我正在尝试使用 XTEA 加密 std::vector。因为使用 std::vector 会带来处理大量数据的各种好处,所以我想使用它。

XTEA 算法使用两个无符号长整数(v0 和 v1)来加密它们,它们需要 64 位数据。

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 向量转换为无符号长指针的最佳方法。

或者是否有另一种方法将向量拆分为 64 位部分以用于加密功能?

4

2 回答 2

2

洞察力来自于意识到每个字符都是一个字节。因此,一个 64 位数字由 8 个字节或两个 32 位数字组成。

因此,一个 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 回答
0

我的问题是,我正在寻找将我的 char 向量转换为无符号长指针的最佳方法。

((unsigned long*)vec.data())从 C++11 或((unsigned long*)&vec[0]))pre-c++11 开始?

PS:我猜有人会过来争辩说它reinterpret_cast<unsigned long*>()迟早应该是一个或什么,他们可能是对的。

另外,我使用了一个 std::string,但这是我执行 enciper 循环的方式:

        string message = readMessage();
        for (size_t i = 0; i < message.length(); i += 8)
        {
            encipher(32, (uint32_t *)&message[i], keys);
        }
        // now message is encrypted

        for (size_t i = 0; i < message.length(); i += 8)
        {
            decipher(32, (uint32_t *)&message[i], keys);
        }
        // now message is decrypted (still may have padding bytes tho)
  • 我刚刚使用了 XTEA 维基百科页面中的示例 C enciper/deciper 函数。
于 2019-03-04T13:58:16.760 回答