Как снять битовую маску, с которой приходят данные от браузера по протоколу WebSocket на языке си

Не могу понять плгоритм, снятия маски, в которой приходят данные от браузера при использовании протокола WS.

Я нашел вот такой код

        masking_key[0] = inbuf[2];
        masking_key[1] = inbuf[3];
        masking_key[2] = inbuf[4];
        masking_key[3] = inbuf[5]; 

        unsigned int i = 6, pl = 0;
        for(; pl < payload_len; i++, pl++)
         {
           payload[pl] = inbuf[i]^masking_key[pl % 4]; 
         }

masking_key - массив чаров на 4 элемента, в который записывается 4 байта маски

inbuf - полное сообщение, пришедшее от клиента

payload - массив, подготовленный для записи расшифрованного сообщения

Если конкретней, я не могу понять эту строчку, зачем делать исключающее побитовое или с элеметом по индексу остаток от деления номера текущей итерации на 4 с остатком

payload[pl] = inbuf[i]^masking_key[pl % 4]; 

Ответы (1 шт):

Автор решения: Arenoros

Маска снимается точно так же как и устанавливается

for(int64_t i = 0; i < len; ++i) { 
  data[i] ^= mask[i % 4];
}

в этом суть операции xor: (a ^ b ) ^ b = a

А для чего это, если коротко, то для того что бы передаваемые данные имели "бинарный" вид.

вот выдержка из стандарта: RFC 6455

The base framing protocol is formally defined by the following ABNF RFC 5234.
It is important to note that the representation of this data is binary, not ASCII characters ...

так же это связано с безопасностью

The unpredictability of the masking key is essential to prevent authors of malicious applications from selecting the bytes that appear on the wire. RFC 4086 discusses what entails a suitable source of entropy for security-sensitive applications...

→ Ссылка