Как сделать XOR шифрование строки в C и обратно с той же функции? - PullRequest
3 голосов
/ 05 марта 2012

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

Та же функция и тип ввода используются для декодирования строки.Это не проблема с перестановкой строк, поскольку она просто переворачивается назад, но может ли это быть легко сделано с помощью XORing, не становясь слишком сложным?Я бы предпочел, чтобы в процессе оставалась только одна строка, как в случае обращения.Вот моя функция разворота.

void reverse_string(unsigned char *buf, int length)
{
int i;
unsigned char temp;

    for (i = 0; i < length / 2; i++)
    {
        temp = buf[i];
        buf[i] = buf[length - i - 1];
        buf[length - i - 1] = temp;
    } 
}

А вот попытка функции XOR

void charxor(char * text, int len) {
const unsigned char enc[8]={173,135,131,121,110,119,187,143};
char ch;
int i;
int ind=0;
for (i=0;i<len;i++) {
    ch=*text++;
    if (ch)
        *text = ch ^ enc[ind++];
    ind %=8;
}


}

Кто-нибудь может помочь?Буду очень признателен!

Ответы [ 2 ]

10 голосов
/ 05 марта 2012

Вы, кажется, немного усложняете вещи. Попробуйте вместо этого:

void charxor (unsigned char *text, int len) {
    const unsigned char enc[8] = {173,135,131,121,110,119,187,143};
    int i;
    for (i = 0; i < len; i++) {
        text[i] ^= enc[i % 8];
    }
}

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

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

0 голосов
/ 26 мая 2019

это pbox, он потребует от вас сделать неповторяющийся целочисленный ключ - случайный - такого же размера, что и указанный блок.последний блок будет начинаться со смещения, которое может быть просто случайными данными.Не распространяется на нулевые терминаторы, поэтому решите, куда направляются данные / что вы делаете с ними.Вы могли бы realloc (бафф, "A") использовать memmove.сделайте 3 64-битных блока и подмножество 16 4-битных блоков из выходных данных 64, и это начинает выглядеть как плохая реализация des, встроенная в него openssl.Основным преимуществом является возможность шифрования / дешифрования с помощью одной и той же функции / адресного пространства.Это также может позволить вам шифровать на месте без дополнительного буфера.KSZ - это длина вашего блока (ов) / ключа

char
*zecr
(bff, zbf, ky, ze)
 char *bff;
 char *zbf;
 unsigned int ky[];
 short ze;
{
/* main encrypt decrypt function */

int i=0;
while( i < KSZ ) {
 int dx = ky[i];

 if( ze == 1 ) {            // encrypt
    char c = bff[dx];
    sprintf(zbf + i, "%c", c);

 } else {                   // decrypt
    char c = bff[i];
    char tk[1] = "";
    sprintf(tk, "%c", c);
    memmove(zbf +dx,  tk, 1);
 }

 i++;
}

return zbf;
}

. Xoring - это бинарная операция, которая даст совершенно разные результаты в зависимости от того, как вы ее разыграли.Вы получили правильную идею, используя ocdec, но если идея состоит в том, чтобы упростить ее, я собираюсь предположить, что вы на самом деле не знаете сборку, несмотря на запрошенную ссылку, придерживайтесь вызовов c, это проще для того, как вы, скорее всего, будете использовать данные.

- женский оргазм, это миф.-SUN TZU

...