2015-04-07 2 views
1

Я пытаюсь зашифровать сообщение из текстового файла, используя бит-мутную операцию XOR слева и справа символов с двумя конкретными ключами из другого файла (keys.txt), но я получаю нечитаемый код перед оригинальный текстовый файл (ничего не изменился), что неверно. Я использую два текстовых файла:Как зашифровать текстовый файл, используя бит-мудрый XOR?

1) input.txt - содержащий сообщение, которое будет шифроваться

2) Keys.txt - Это содержит два символа, которые делают операцию XOR к каждому символу на входе .txt (символ 1 является ключом 1 и 2 символов является ключом 2)

следующий код в моей программе:

str[i]=str[i]^str2[2]; 
str[++i]=str[i]^str2[1]; 
break; 

является строка кода, предполагают, чтобы выполнять операцию XOR

Примечание Мой желаемый результат должен выглядеть примерно так:!

м @ # ЭМИ (> 9S (@) H # ФМН # XGmmmmU, H Gmr (DMI "VMD, F (S XMU% DMM "С> U (S>, О) 9I (9Т U D>, М, Е; @ # В (ГМУ% D4, S (?:! @ $ U $ O *" ИМУ% DMR% Н # Р ! D`V $ M! 4N8.N Dm @ # EmK "H # 9I (+ mmmm) @ # B (f

Может кто-нибудь уточнить проблему, с которой я столкнулся?

Пользователь должен ввести:

gcc myProgram.c 
./a.out e input.txt keys.txt 

(Электронный просто стоит для шифрования)

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


int main(int args, char *argc[]){ 

int i; 
int len=0; 
char str[1024]; 
char str2[2]; 
FILE *finp; 
FILE *keyFile; 

if (strcmp(argc[1], "e") == 0) 
{ 
    if ((finp = fopen(argc[2],"r")) == NULL) 
    { 
    printf("Could Not Open file %s\n", argc[2]); 
    exit(1); 
    } 

    if ((keyFile = fopen(argc[3],"r")) == NULL) 
    { 
    printf("Could Not Open file %s\n", argc[3]); 
    exit(1); 
    } 


    while((fgets(str,1024,finp)!=NULL)&(fgets(str2,2,keyFile)!=NULL)) 
    { 
    printf("%c\n %c",str2[1],str2[2]); 


    /* *** START CODE THAT USES INPUT.TXT FILE & KEYS.TXT *** */ 
    len = strlen(str); 
    for(i=0;i<len;i++) 
    { 
     str[i]=str[i]^str2[2]; 
     str[++i]=str[i]^str2[1]; 
     break; 
    } 
    } 

    printf("%s\n", str); 
    fclose(finp); 
    return 0; 

} 
else 
{ 
    printf("SORRY!"); 
} 
+6

Не вызывайте это шифрование. :-) –

+2

Это шифрование, хотя и очень слабое. Это шифр сдвига (Цезарский шифр). –

ответ

3

C массивы индексов равны нулю основе, то вы должны использовать

str2[0],str2[1] 

вместо от

str2[1],str2[2] 

В этом фрагменте

for(i=0;i<len;i++) 
{ 
    str[i]=str[i]^str2[2]; 
    str[++i]=str[i]^str2[1]; 
    break; 
} 

остановка цикла оператор перерыв после первой итерации. Вы должны удалить его. Тогда вы получите

for(i=0;i<len;i++) 
{ 
    str[i]^=str2[1]; 
    str[++i]^=str2[0]; 
} 

В соответствии

while((fgets(str,1024,finp)!=NULL)&(fgets(str2,2,keyFile)!=NULL)) 

вам нужно логическое И вместо побитового

while((fgets(str,1024,finp)!=NULL)&&(fgets(str2,2,keyFile)!=NULL)) 

И если ваш вклад.txt-файл содержит больше 1024 байта, чтобы показать все результаты, необходимые для перемещения printf («% s \ n», str); в то время цикл

while((fgets(str,1024,finp)!=NULL)&&(fgets(str2,2,keyFile)!=NULL)) 
{ 
    ... 
    printf("%s\n", str); 
} 
3

Есть несколько проблем с вашим кодом:

while((fgets(str,1024,finp)!=NULL)&(fgets(str2,2,keyFile)!=NULL)) 

Вы должны использовать логический и оператор (& &) вместо побитового и (&)

char str2[2]; 

str2 может содержать только 2 символа, поэтому str [2] является незаконным. Кроме того, у него нет места для хранения конечного символа NULL.

Петля for неверна. Вот альтернатива:

for(i=0; i<len; i++) { 
str[i] ^= str2[i%2]; 
} 

Наконец, просто XORing два символа может давать значения, которые не являются допустимыми символами ASCII и, таким образом, не будут напечатаны неправильно. 'b'^'c' равно 1, которое, скорее всего, будет напечатано как нежелательное в вашем терминале. Рассмотрите возможность использования операции modulo для создания строки результата.

1

Чтобы расширить ответ на вопрос Sourav: Если вы используете 8-битный код, например ISO-8859-1, в котором печатные символы от 32 до 126 и от 160 до 255, что дает 191 отличное значение. Вместо использования XOR вы можете преобразовать каждый символ в индекс от 0 до 190, добавить индекс символа сообщения и соответствующий индексный индекс 191 индекса символов и преобразовать результат обратно в символ.

+0

Можете ли вы привести нам пример? – Krythic

+0

См. Ниже. Я думал, что это будет слишком велико для комментария. –

1

С точки зрения шифрования это шифрование, хотя и очень слабое. Это шифр сдвига (Цезарский шифр). Обратите внимание, что ул [0]^str2 [1] является константой, а порядок операций XOR не имеет значения, так что

str[i]^=str2[1]; 
str[++i]^=str2[0]; 

эквивалентно:

char str12=str2[0]^str2[1]; // Outside of the loop 
... 
str[++i]^=str12; 

Для замены XOR с методом, который сохраняет читаемость следующим образом, является моим решением:

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

int index(int c) 
{ 
    int i; 
    if ((c >= 32) && (c <= 126)) { 
     i = c - 32; 
    } else if ((c >= 160) && (c <= 255)) { 
     i = c - 65; 
    } else { 
     i = 63; // Question mark 
    } 
    return i; 
} 

char unindex(int i) 
{ 
    if (i <= 94) { 
     return (char)(i + 32); 
    } else { 
     return (char)(i + 65); 
    } 
} 

char encrypt(char a, char b) 
{ 
    int aa = index(a & 255); 
    int bb = index(b & 255); 
    int cc = (aa + bb) % 191; 
    return unindex(cc); 
} 

char decrypt (char a, char b){ 
    int aa = index(a & 255); 
    int bb = index(b & 255); 
    int cc = (191 + aa - bb) % 191; 
    return unindex(cc); 
} 

int main(int args, char *argc[]){ 

    char e; 

    printf("test\n"); 

    e = encrypt('a',' '); 
    printf ("encrypt('a',' ') = %c\n" , e); 
    printf ("decrypt('a',' ') = %c\n" , decrypt (e, ' ')); 

    e = encrypt('a','!'); 
    printf ("encrypt('a','!') = %c\n" , e); 
    printf ("decrypt('a','!') = %c\n" , decrypt (e, '!')); 

    e = encrypt('ב',' '); 
    printf ("encrypt('ב',' ') = %c\n" , e); 
    printf ("decrypt('ב',' ') = %c\n" , decrypt(e,' ')); 

    printf("(char) 255 = %c\n", (char) 255); 
    e = encrypt((char) 255,' '); 
    printf ("encrypt(255,' ') = %c\n" , e); 
    printf ("decrypt(255,' ') = %c\n" , decrypt(e,' ')); 

    e = encrypt('A',(char) 255); 
    printf ("encrypt('A',255) = %c\n" , e); 
    printf ("decrypt('A',255) = %c\n" , decrypt(e,(char) 255)); 

    e = encrypt((char) 255,(char) 255); 
    printf ("encrypt(255,255) = %c\n" , e); 
    printf ("decrypt(255,255) = %c\n" , decrypt(e,(char) 255)); 

    printf("end test\n"); 

    return; 
}es 

 Смежные вопросы

  • Нет связанных вопросов^_^