XTEA函数与std :: vector

时间:2014-04-12 11:27:27

标签: c++ vector xtea

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

XTEA-Alogrithm使用两个无符号长(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位部分中为矢量分割矢量?

2 个答案:

答案 0 :(得分:2)

洞察力在于意识到每个字符都是一个字节;因此64位数字由8个字节或2个32位数组成。

因此,一个32位数字可以存储4个字节,因此您可以为char矢量中的每个8字节块存储一对32字节数字中的一对4字节数字。然后,您可以将此对传递给您的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])。

位移'&lt;&lt;&lt;操作符移位给定字节位应存储在uint32_t中的位置(例如,上例中的第一个字节存储在数据块[0]的前8位)。 '|'运算符提供所有位的串联,以便最终得到完整的32位数。希望这是有道理的。

答案 1 :(得分:0)

  

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

((unsigned long*)vec.data())是C ++ 11还是((unsigned long*)&vec[0]))

PS:我想有人会来争论它应该是reinterpret_cast<unsigned long*>()还是早晚的事情,他们可能是正确的。

此外,我使用了std :: string,但是这是我执行加密循环的方式:

        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加密/解密函数。