простой алгоритм XOR - PullRequest
       25

простой алгоритм XOR

2 голосов
/ 10 ноября 2011

Хотя я часто использовал C ++, я борюсь с различиями в C (в основном в строках).

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

Спасибо

EDIT: И ключ, и сообщение являются символами *

Ответы [ 3 ]

9 голосов
/ 10 ноября 2011

ОК, я взломал минуту и ​​придумал это (только смутно проверено):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * xorencrypt(char * message, char * key) {
    size_t messagelen = strlen(message);
    size_t keylen = strlen(key);

    char * encrypted = malloc(messagelen+1);

    int i;
    for(i = 0; i < messagelen; i++) {
        encrypted[i] = message[i] ^ key[i % keylen];
    }
    encrypted[messagelen] = '\0';

    return encrypted;
}

int main(int argc, char * argv[]) {
    char * message = "test message";
    char * key = "abc";

    char * encrypted = xorencrypt(message, key);
    printf("%s\n", encrypted);
    free(encrypted);

    return 0;
}

Обратите внимание, что функция xorencrypt выделяет и возвращает новую строку, так что ответственность за вызовчтобы освободить его, когда закончите.

4 голосов
/ 10 ноября 2011

C очень близко к Ассемблеру, поэтому этот пример короткий:

while (*string)
    *string++ ^= key;

при условии char *string; и char key.

3 голосов
/ 10 ноября 2011

Для чего стоит, объедините ответы от @ ott-- & @Tim, чтобы сформировать Xortron.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *xor(char *string, const char *key)
{
    char *s = string;
    size_t length = strlen(key), i = 0;
    while (*s) {
            *s++ ^= key[i++ % length];
    }
    return string;
}

int main(int argc, char **argv)
{
    const char *key = "abc";
    if (argc < 2) {
            fprintf(stderr, "%s: no input\n", argv[0]);
            return EXIT_FAILURE;
    }
    printf("%s\n", xor(xor(argv[1], key), key));
    return EXIT_SUCCESS;
}
...