我对加密非常感兴趣,因为我也喜欢编程,所以我决定用一个小程序来加密使用XTEA加密算法的文件。 我从Wikipedia获得灵感,所以我写了这个函数来进行加密(为了节省空间,我不会发布解密函数,因为它几乎是一样的):
void encipher(long *v, long *k)
{
long v0 = v[0], v1 = v[1];
long sum = 0;
long delta = 0x9e3779b9;
short rounds = 32;
for(uint32 i = 0; i<rounds; i++)
{
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
}
v[0] = v1;
v[1] = v1;
}
现在当我想使用它时,我写了这段代码:
long data[2]; // v0 and v1, 64bits
data[0] = 1;
data[1] = 1;
long key[4]; // 4 * 4 bytes = 16bytes = 128bits
*key = 123; // sets the key
cout << "READ: \t\t" << data[0] << endl << "\t\t" << data[1] << endl;
encipher(data, key);
cout << "ENCIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl;
decipher(data, key);
cout << "DECIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl;
我总是得到运行时崩溃或错误的解密文本:
我确实理解程序的基础知识,但我真的不知道我的代码有什么问题。为什么加密数据[0]和数据1相同?为什么破译数据与起始数据完全不同?我使用的类型错了吗? 我希望你能帮助我解决我的问题:)。
答案 0 :(得分:4)
问题在于:
v[0] = v1; // should be v[0] = v0
v[1] = v1;
此外,您只需设置密钥的前4个字节。剩余的12个字节未初始化。 尝试这样的事情:
key[0] = 0x12345678;
key[1] = 0x90ABCDEF;
key[2] = 0xFEDCBA09;
key[3] = 0x87654321;
The fixed code给了我这个输出:
READ: 1
1
ENCIPHERED: -303182565
-1255815002
DECIPHERED: 1
1