1

我正在通过一个小的 C 文件进行 xor 解码,并且遇到了字节序问题......我对如何解决它们有点困惑。这真的是我第一次在 C 中深入地玩这个按位运算。

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

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

我很想#include <byteswap.h>然后打电话bswap_32()。但是,虽然这适用于小端,但它可能对大端产生相反的效果。我假设我需要丑陋的#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)指针回放异或编码的缓冲区,我会得到这个(通过基本的 printf):

0xfaa4 0xfaad 0xfeb1 0xfab7


并使用四字节指针(uint32_t):

0xfaadfaa4 0xfab7feb1



我希望上面的内容可以改为两字节指针:

0xa4fa 0xadfa 0xb1fe 0xb7fa

和四字节指针:

0xa4faadfa 0xb1feb7fa


想法?



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

4

2 回答 2

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];
}
于 2011-06-29T03:19:02.340 回答
0

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

于 2011-06-29T03:13:45.943 回答