处理具有不同密钥大小和字节序的xor

时间:2011-06-29 02:47:45

标签: c endianness xor bitwise-xor

我正在通过一个小的C文件来解决xor解码问题,并且遇到了有关字节序的问题......我对如何解决它们感到有些困惑。这是我第一次在C中使用按位操作来深入演绎。

如果我使用一个字节的xor键并在uint8_t指针中选取几个xor编码的值,我的基本代码工作正常。遍历每个字节,将其与密钥对齐,并将结果存储在已解码的字节数组/缓冲区中,然后将其打印回控制台。

但是,如果我尝试使用双字节xor键,那么字节序会开始妨碍。我目前将密钥粘贴到uint32_t中,因为我不打算处理大于32位的xor密钥。在小端系统上,0xc39f的xor密钥存储为0x9fc3。如果我一次播放一个字节,那么要解码的字节是big-endian,但如果我尝试一次播放两个字节(与xor键大小相同),它们也会转换为little-endian )。

我很想#include <byteswap.h>,然后致电bswap_32()。但是虽然这可以在小端上工作,但它可能会对big-endian产生相反的影响。我认为那时我需要丑陋的#ifdef只能使用bswap_32()来表示小端拱。我认为,必须有一种更便携的方式来实现这一目标。

随机样本字符串:

g   e   n   e   r   a   t   e
67  65  6e  65  72  61  74  65

Xor 0xc39f

a4  fa  ad  fa  b1  fe  b7  fa


如果我用两字节(uint16_t)指针回放xor编码的缓冲区,我得到这个(通过基本的printf):

0xfaa4 0xfaad 0xfeb1 0xfab7


使用四字节指针(uint32_t):

0xfaadfaa4 0xfab7feb1


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

0xa4fa 0xadfa 0xb1fe 0xb7fa

四字节指针:

0xa4faadfa 0xb1feb7fa


思考?



编辑:任何参与者?目前的答案不足以满足我的需求。

2 个答案:

答案 0 :(得分:2)

你过分思考 - 只需将你的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];
}

答案 1 :(得分:0)

尝试使用专为此目的而设计的htonl()宏。它代表“十六进制到网络长”,并定义为交换(或不交换)字节,以便在通过网络传输之前根据需要生成结果值big-endian。