Как расшифровать смещенное сообщение с помощью XOR? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть сообщение m, которое я шифрую кодом

c = m xor [m<<6] xor [m<<10] 

(m<<x означает, что я сдвигаю его на x битов - например, 1001 << 2 = 0100) </p>

Мне нужно расшифровать это сообщение.

Я пробовал подобный код:

c xor [c<<6] xor [c<<10]

ИЛИ

c xor [c>>6] xor [c>>10] 

, но ни один из них не работал.

1 Ответ

0 голосов
/ 01 июня 2019

Функция c = m xor [m<<6] xor [m<<10] является биекцией (то есть обратимой по заданному модулю 2 n ). Так что ты в порядке ...

Просто пошагово де-XOR значение на 6 и 10 бит, начиная с младших бит.

int main() {
    uint32_t n = 0xfffffff;
    for (uint32_t m = 0; m < n; ++m) {

        uint32_t c = m ^ (m << 6) ^ (m << 10); // c = encrypted value

        uint32_t x = c;
        x ^= ((x &       0x3F) << 6);
        x ^= ((x &      0x3FF) << 10);
        x ^= ((x &      0xFC0) << 6);
        x ^= ((x &    0x3F000) << 6);
        x ^= ((x &    0xFFC00) << 10);
        x ^= ((x &   0xFC0000) << 6);
        x ^= ((x & 0x3F000000) << 6);
        x ^= ((x & 0x3FF00000) << 10);

        if (m != x) {
            printf("Mismatch: %X > %X > %X\n", m, c, x); // should never happen
            break;
        }
    }
}
...