Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 使用XTEA加密函数的类型_Encryption_Types_Cryptography - Fatal编程技术网

Encryption 使用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

我对密码学非常感兴趣,因为我也喜欢编程,所以我决定制作一个小程序,使用XTEA加密算法对文件进行加密。 我从中得到启发,所以我写了这个函数来进行加密以节省空间,我不会发布解密函数,因为它几乎是一样的:

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;”然后用这个程序对它进行加密?