2014-04-12 66 views
1

我想用XTEA加密std :: vector。因为使用std :: vector带来了处理大量数据的各种好处,所以我想使用它。XTEA函数与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位部分的加密功能?

+0

我建议你向你的问题添加一个明确的声明,说明矢量是什么类型。你真的有'std :: vector '?它看起来像''xtea_enc''函数是由一个库提供的,并且您正在查看实现细节。当你需要做的只是传递一个指向数据开始的指针,加上长度。 – NicholasM

回答

0

洞察意识到每个字符都是一个字节;因此一个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中的位置(例如,上例中的第一个字节存储在数据块的前8位[ 0])。 '|'运算符提供所有位的并置,以便最终获得完整的32位数。希望这是有道理的。

相关问题