Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
C 处理不同密钥大小和长度的异或_C_Endianness_Xor_Bitwise Xor - Fatal编程技术网

C 处理不同密钥大小和长度的异或

C 处理不同密钥大小和长度的异或,c,endianness,xor,bitwise-xor,C,Endianness,Xor,Bitwise Xor,我正在通过一个小的C文件进行xor解码,遇到了endianness的问题……我有点被困在如何解决这些问题上。这是我第一次在C语言中深入研究逐位运算 如果我使用一个单字节的xor键,并将几个xor编码的值提取到一个uint8_t指针中,那么我的基本代码工作正常。遍历每个字节,对其进行异或,并将结果存储在解码字节数组/缓冲区中,然后将其打印回控制台 然而,如果我尝试一个两字节的xor键,那么endianness开始妨碍我。我目前将密钥插入uint32_t,因为我不打算处理大于32位的异或密钥。在小端

我正在通过一个小的C文件进行xor解码,遇到了endianness的问题……我有点被困在如何解决这些问题上。这是我第一次在C语言中深入研究逐位运算

如果我使用一个单字节的xor键,并将几个xor编码的值提取到一个uint8_t指针中,那么我的基本代码工作正常。遍历每个字节,对其进行异或,并将结果存储在解码字节数组/缓冲区中,然后将其打印回控制台

然而,如果我尝试一个两字节的xor键,那么endianness开始妨碍我。我目前将密钥插入uint32_t,因为我不打算处理大于32位的异或密钥。在小端系统中,
0xc39f
的异或键存储为
0x9fc3
。如果我一次播放一个字节,则要解码的字节是大端字节,但如果我尝试一次播放两个字节(与xor键大小相同),它们也会被翻转为小端字节

我很想
#包括
,然后调用
bswap\u 32()
。但是,虽然这对小端数有效,但对大端数可能产生相反的效果。我想我需要丑陋的ifdef只对小端拱门使用
bswap_32()
。我想,必须有一种更便携的方式来实现这一点

随机样本串:

g e n e r a t e
67 65 6e 65 72 61 74 65
Xor 0xc39f
a4不动产和b1不动产和b7不动产

如果我用两个字节(uint16\t)指针回放xor编码的缓冲区,我会得到以下结果(通过基本printf):

0xfaa4 0xfaad 0xfeb1 0xfab7

并带有四字节指针(uint32\t):

0xfaadfaa4 0xfab7feb1


我希望上面的两个字节指针:

0xa4fa 0xadfa 0xb1fe 0xb7fa
和四字节指针:

0xa4faadfa 0xb1feb7fa

你有什么想法




编辑:有接受者吗?当前的答案不足以满足我的需要。

请尝试使用
htonl()
宏,该宏正是为此而设计的。它代表“十六进制到网络长”,定义为交换(或不交换)字节,使结果值变为大端字节,然后再通过网络传输。

您想得太多了,只需将xor键视为无端二进制blob,并将其转换为本机
uint32\t
,即可获得性能:

void xor_encrypt_slow(uint8_t *data, size_t len, uint8_t key[4])
{
    // key is a 4-byte xor key
    size_t i;
    for(i = 0; i < len; i++)
        data[i] ^= key[i % 4];
}

void xor_encrypt_fast(uint8_t *data, size_t len, uint8_t key[4])
{
    // Convert key to a 32-bit value
    uint32_t key32 = *(uint32_t *)key;

    // This assumes that data is aligned on a 4-byte boundary; if not, adjust
    // accordingly
    size_t i;
    for(i = 0; i + 3 < len; i += 4)
        ((uint32_t *)data)[i] ^= key32;
    // Handle the remainder, if len is not a multiple of 4
    for( ; i < len; i++)
        data[i] ^= key[i % 4];
}
void xor\u encrypt\u slow(uint8\u t*数据、大小长度、uint8\u t密钥[4])
{
//密钥是一个4字节的异或密钥
尺寸i;
对于(i=0;i
密钥已存储在uint32\t中,但不是指针。我的带有编码值的缓冲区与保存解码值的缓冲区不同。解码的缓冲区将是一个uint8_t数组。通过使用xor键作为一个直接的uint32_t,即使它只是一个字节,如果一次执行4个字节的操作,如何确保每个字节都只被一个字节xor(如果我在这一点上出错,请大叫)?我对这个答案不满意。但是,没有其他人参与,所以作为最完整的答案,即使它不能满足我的问题,它也会赢。代码有点混乱,实际上只是尝试使用switch语句来查看我是否处理1、2或4字节的Xor键,然后在每个案例中适当地循环。
case2
case4
的位实际上只是
printf()
调用来转储字节并查看endianness如何影响它们。所以真的没有太多值得发布的内容。