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