Шифрование: реверсивный битовый и битовый сдвиг? - PullRequest
0 голосов
/ 05 августа 2009

Я пытаюсь изменить шифрование XOR. У меня есть код шифрования:

// Walk the 16 nibbles in the 64 bit long long, selecting the corresponding key digit
// and XORing it into the result.
unsigned long long result = 0;
for( i=0; i<16; i++ )
{
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}

Первая строка в порядке.

Второго и третьего нет. Мои 3 вопроса:

  1. Полагаю, я могу просто обратить битшифт, и он будет работать правильно?
  2. Но как мне поменять местами бит? Так как же изменить # 2?
  3. Так что, если ответ «да» на # 1, и я знаю, как сделать # 2, то я могу просто сделать это и иметь возможность расшифровать да?

Ответы [ 4 ]

4 голосов
/ 05 августа 2009

Код, который вы представили, похоже, просто выполняет XOR для каждого 4-битного куска данных (т.е. эквивалент одного шестнадцатеричного символа за раз).

Битовые операции & и сдвиг просто маскируют конкретный набор битов, которые будут использоваться в каждом раунде цикла for. Вам не нужно «восстанавливать» потерянные биты, поскольку все, что делается, - это создание битовой маски.

Поскольку это прямое шифрование XOR, оно имеет следующую процедуру дешифрования:

unsigned long long result = 0;
for( i=0; i<16; i++ )
{  
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}

Что является процедурой шифрования (шифрование XOR расшифровывается путем выполнения зашифрованного текста через процедуру шифрования с тем же ключом).

Конечно, я чувствую себя обязанным отметить, что шифрование XOR - это просто игрушка - оно невероятно слабое и легко взломанное. Поэтому я надеюсь, что вы просто играете или учитесь.

К сожалению, этот код часто встречается в реальных продуктах ...

1 голос
/ 05 августа 2009

Нельзя изменить битовый сдвиг со 100% уверенностью, что он будет работать.

0011 >> 1 становится 0001

0001 << 1 становится 0010 </p>

И поменять местами &? Опять же ... вы пытаетесь получить два входных значения из одного ответа. 1001 может быть сформирован из (1111 и 1001) или (1011 и 1101). Есть много возможных комбинаций.

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

0 голосов
/ 09 августа 2009

спасибо за все ответы, но весь этот алгоритм шифрования xor просто делает одну вещь в конце, то есть c = a ^ b.

Так что, ничего не меняя в коде, я просто использую ключ с зашифрованной строкой и получу обратно расшифрованное значение.

Но, как сказал Майкл, код выполняет шифрование на шестнадцатеричный символ.

0 голосов
/ 06 августа 2009

Как говорит Майкл, процедура дешифрования для простого "шифрования" XOR такая же, как и процедура шифрования.

Однако я вижу проблему в вашем коде.Значения 0xF являются (целыми) целочисленными константами, и если вы смещаете их на большее количество битов, чем имеет int, результат не определен.

Измените их на длинные беззнаковые константы без знака (0xFULL) - и измените k на беззнаковыедолго долго по той же причине.

...