我试图用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位部分中为矢量分割矢量?
答案 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)