Encryption 使用XTEA加密函数的类型
我对密码学非常感兴趣,因为我也喜欢编程,所以我决定制作一个小程序,使用XTEA加密算法对文件进行加密。 我从中得到启发,所以我写了这个函数来进行加密以节省空间,我不会发布解密函数,因为它几乎是一样的:Encryption 使用XTEA加密函数的类型,encryption,types,cryptography,Encryption,Types,Cryptography,我对密码学非常感兴趣,因为我也喜欢编程,所以我决定制作一个小程序,使用XTEA加密算法对文件进行加密。 我从中得到启发,所以我写了这个函数来进行加密以节省空间,我不会发布解密函数,因为它几乎是一样的: void encipher(long *v, long *k) { long v0 = v[0], v1 = v[1]; long sum = 0; long delta = 0x9e3779b9; short rounds = 32; for(ui
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]和数据相同?为什么解密后的数据与起始数据完全不同?我用错类型了吗?
我希望你能帮我解决我的问题
简
问题在于:
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;
给我这个输出:
READ: 1
1
ENCIPHERED: -303182565
-1255815002
DECIPHERED: 1
1
问题在于:
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;
给我这个输出:
READ: 1
1
ENCIPHERED: -303182565
-1255815002
DECIPHERED: 1
1
谢谢你的回答!我可以在v1和v0中看到我愚蠢的错误输入。你能解释一下密钥中字节的设置吗?我对十六进制不太了解,但我能不能把[1…3]键设为0?不幸的是,你的回答没有解决主要问题,但我相信它帮助很大@詹曼:当然可以将键[1]、[2]和键[3]设置为0,但需要将它们设置为某个值。如果您没有将它们设置为任何未初始化的值,那么它们只会在内存的该部分随机设置任何值。这不是跟零钱一起用的吗?你可能在破译方面也有类似的问题吗?非常感谢,现在我成功了。如果可以的话,再问一个小问题:当我想从文件中读取数据时,我可以只使用“myIfstream.readsomechar*&data[0],4;”然后用这个程序对它进行加密?谢谢你的回答!我可以在v1和v0中看到我愚蠢的错误输入。你能解释一下密钥中字节的设置吗?我对十六进制不太了解,但我能不能把[1…3]键设为0?不幸的是,你的回答没有解决主要问题,但我相信它帮助很大@詹曼:当然可以将键[1]、[2]和键[3]设置为0,但需要将它们设置为某个值。如果您没有将它们设置为任何未初始化的值,那么它们只会在内存的该部分随机设置任何值。这不是跟零钱一起用的吗?你可能在破译方面也有类似的问题吗?非常感谢,现在我成功了。如果可以的话,再问一个小问题:当我想从文件中读取数据时,我可以只使用“myIfstream.readsomechar*&data[0],4;”然后用这个程序对它进行加密?