带有std::vector的XTEA函数
XTEA-function with std::vector
我正在尝试用XTEA加密std::向量。因为使用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));
我的问题是,我正在寻找将我的字符向量转换为无符号长指针的最佳方法。
或者,对于加密函数,是否有另一种将矢量拆分为64位部分的方法?
认识到每个字符都是一个字节;因此一个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])。
比特移位'<lt;'运算符移动给定字节的位应该存储在uint32_t中的位置(因此,例如,上面示例中的第一个字节存储在数据块[0]的前8位中)。"|"运算符提供了所有位的连接,这样您就可以得到完整的32位数字。希望这是有道理的。
我的问题是,我正在寻找将我的字符向量转换为无符号长指针的最佳方法。
从C++11开始的((unsigned long*)vec.data())
还是在C++11之前的((unsigned long*)&vec[0]))
?
附言:我想迟早会有人来争论它应该是reinterpret_cast<unsigned long*>()
之类的,他们可能是对的。
此外,我使用了std::字符串,但以下是我如何执行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函数
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 带有std::vector的XTEA函数