C # бит в бит XOR & File I / O - PullRequest
       25

C # бит в бит XOR & File I / O

0 голосов
/ 06 марта 2011

ОК, у меня есть файл размером 35 МБ, который зашифрован с разрядным XOR (побитовый XOR, я полагаю), и я хотел бы знать хороший способ расшифровать его, а затем снова зашифровать, используя File I /O на C #.

Вот алгоритм Enc / Dec:

Encrypt:----------------------Decrypt:
Bit  0 -> Bit 26--------------Bit  0 -> Bit 18
Bit  1 -> Bit 31--------------Bit  1 -> Bit 29
Bit  2 -> Bit 17--------------Bit  2 -> Bit  7
Bit  3 -> Bit 10--------------Bit  3 -> Bit 25
Bit  4 -> Bit 30--------------Bit  4 -> Bit 15
Bit  5 -> Bit 16--------------Bit  5 -> Bit 31
Bit  6 -> Bit 24--------------Bit  6 -> Bit 22
Bit  7 -> Bit  2--------------Bit  7 -> Bit 27
Bit  8 -> Bit 29--------------Bit  8 -> Bit  9
Bit  9 -> Bit  8--------------Bit  9 -> Bit 26
Bit 10 -> Bit 20--------------Bit 10 -> Bit  3
Bit 11 -> Bit 15--------------Bit 11 -> Bit 13
Bit 12 -> Bit 28--------------Bit 12 -> Bit 19
Bit 13 -> Bit 11--------------Bit 13 -> Bit 14
Bit 14 -> Bit 13--------------Bit 14 -> Bit 20
Bit 15 -> Bit  4--------------Bit 15 -> Bit 11
Bit 16 -> Bit 19--------------Bit 16 -> Bit  5
Bit 17 -> Bit 23--------------Bit 17 -> Bit  2
Bit 18 -> Bit  0--------------Bit 18 -> Bit 23
Bit 19 -> Bit 12--------------Bit 19 -> Bit 16
Bit 20 -> Bit 14--------------Bit 20 -> Bit 10
Bit 21 -> Bit 27--------------Bit 21 -> Bit 24
Bit 22 -> Bit  6--------------Bit 22 -> Bit 28
Bit 23 -> Bit 18--------------Bit 23 -> Bit 17
Bit 24 -> Bit 21--------------Bit 24 -> Bit  6
Bit 25 -> Bit  3--------------Bit 25 -> Bit 30
Bit 26 -> Bit  9--------------Bit 26 -> Bit  0
Bit 27 -> Bit  7--------------Bit 27 -> Bit 21
Bit 28 -> Bit 22--------------Bit 28 -> Bit 12
Bit 29 -> Bit  1--------------Bit 29 -> Bit  8
Bit 30 -> Bit 25--------------Bit 30 -> Bit  4
Bit 31 -> Bit  5--------------Bit 31 -> Bit  1

Ответы [ 3 ]

4 голосов
/ 06 марта 2011

Это не побитовый XOR - это фактически побитовый шифр замещения .Вы понимаете, что это только «шифрование» в самом широком смысле этого слова, верно?

В основном вам понадобится два шага:

  • Пишите методы для транспонирования битов для шифрования / дешифрования,каждый из которых принимает 32-разрядное целое число и возвращает 32-разрядное целое число
  • Считывает файл по одному 32-разрядному целому числу за раз, применяет соответствующую операцию и записывает результат в другой файл.Возможно, вы захотите использовать BinaryReader и BinaryWriter для этого.

(Очевидно, вы можете оптимизировать с буферизацией, но это общая суть.)

Вы можете найти этопроще всего работать с uint вместо int, чтобы не волноваться о знаковых битах.Примерно так:

public static uint Encrypt(uint input)
{
    return (((input >> 0) & 1) << 26) |
           (((input >> 1) & 1) << 31) |
           (((input >> 2) & 1) << 17) |
           ...
           (((input >> 31) & 1) << 5);
}

Вы можете сделать эту таблицу управляемой с таблицей для шифрования и таблицей для дешифрования, но я не уверен, что буду беспокоиться.

Обратите внимание, чтоесли вы на самом деле используете это для хранения конфиденциальной информации, вы должны начать использовать real шифрование как можно скорее.

1 голос
/ 06 марта 2011

Сначала вы должны сделать функцию для получения одного бита и функцию для ее сохранения в любом месте:

int getBit(int position, int word)
{
    return ((word >> position) & 1);
}

void setBit(int position, int value, ref word)
{
    word = (word & (value << position));
}

Затем вы должны выполнить каждое преобразование вручную, что-то вроде (если я понял вашалгоритм правильно):

int b1 = getBit(0, word);
int b2 = getBit(18, word);
setBit(0, b1 ^ b2, ref word);
1 голос
/ 06 марта 2011

Это не XOR .Если бы это было просто, вы бы просто переписали данные с тем же значением снова в расшифровали их .

То, что вы описываете, - это некое шифрование с шифрованием.другие говорили, что это не безопасное шифрование.Он использует метод, обычно известный как " безопасность через неизвестность ."

...