Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шифр на Си


Автор: tommy256 28.11.2007, 23:33
Хай всем, пишу прогу для шифрования файлов методом XOR, там алгоритм шифрования и дешифрования одинановый,я так понял.... вот ниже прога, шифрует нормально, а дешифровать не могу, то есть я пишу,  из файла 1.txt  в  шифровать в файл 2.txt.а при дешифровании пишу наоборот, из файла 2.txt в файл 3.txt. не дешифрует....ПОмогите плиз
Код

#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<dos.h>
void main()
 {
char * s=(char*) malloc (sizeof(char)*80);
char z,c,ch;
char data[6];
char res[50];
int k,i,j,a,q,y;
 printf("\n Vvedite imya faila wufr/dewufr");
gets(s);
FILE*f1=fopen(s,"br");
printf("\n kyda wufrovat'/dewufr ?");
gets(s);
printf("\n Please Enter password");
for (i=1;i<7;i++)  // на экране отображаются звёздочки и пароль записал в массив
{ ch=getche();
data[i-1]=ch;
printf("\b*");
}
FILE*f2=fopen(s,"bw");
 a=0;
while ((c=fgetc(f1))!=EOF)   // количество байт в файле
{
a++;
k=a; }


 for (q=0,j=0;q<6,j<k;q++)      // Алгоритм XOR

{ c=fgetc(f1);
 res[j]=c^data[q];
 fputc(res[j],f2);
j++;}
printf("\n Finished");
 fclose(f1);
fclose(f2);
                 }

Автор: MAKCim 28.11.2007, 23:35
tommy256

M
MAKCim
Модератор: Используйте тег код!

Автор: likehood 28.11.2007, 23:54
Цитата(tommy256 @  29.11.2007,  00:33 Найти цитируемый пост)
while ((c=fgetc(f1))!=EOF)

при работе с двоичным файлом значение EOF может встериться раньше, чем ты дойдешь до конца файла.
если хочешь определить размер файла, можешь установить указатель на конец файла функцией fseek(f1, 0, SEEK_END) и считав его функцией ftell(f1).
только не забудь вернуться к началу файла - fseek(f1, 0, SEEK_SET). кстати, у тебя та же ошибка - ты доходишь до "конца" фала f1 и продолжаешь читать данные с этого же места.

Автор: tommy256 29.11.2007, 00:49
А лучше работать в текстовом режиме или в бинарном? + если в бинарном режиме то вместо putc, getc будут другие функции, помоему, типо fwrite, fread я могу и ошибаться...
2 likehood Можешь дать асю, надо обсудить smile
Или кто может помочь, напишите в аську 386210191
P.S. Модератор напиши в личку что за тэг надо было написать ? 

Автор: tommy256 29.11.2007, 13:44
Или дайте исходник, шифрования дешифрования файлов на С, очень надо ребята...

Автор: xvr 29.11.2007, 14:44
Цитата(tommy256 @ 28.11.2007,  23:33)
Хай всем, пишу прогу для шифрования файлов методом XOR, там алгоритм шифрования и дешифрования одинановый,я так понял.... вот ниже прога, шифрует нормально, а дешифровать не могу, то есть я пишу,  из файла 1.txt  в  шифровать в файл 2.txt.а при дешифровании пишу наоборот, из файла 2.txt в файл 3.txt. не дешифрует....ПОмогите плиз

Распечатай свой исходник, повесь на стену и подпиши - ТАК ПИСАТЬ НЕЛЬЗЯ!

Цитата

Модератор: Используйте тег код!

Он у него стоит smile

Код

#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<dos.h>  // Зачем?
void main()
 {
   char * s=(char*) malloc (sizeof(char)*80);  //Зачем malloc ???
   char z,c,ch;
   char data[6];
   char res[50];
   int k,i,j,a,q,y;
   printf("\n Vvedite imya faila wufr/dewufr");
   gets(s);
   FILE*f1=fopen(s,"br");
   printf("\n kyda wufrovat'/dewufr ?");
   gets(s);
   printf("\n Please Enter password");
   for (i=1;i<7;i++)  // на экране отображаются звёздочки и пароль записал в массив
    {
     ch=getche();
     data[i-1]=ch;
     printf("\b*");
   }
  FILE*f2=fopen(s,"bw");

  a=0;
  while ((c=fgetc(f1))!=EOF)   // количество байт в файле
   {
    a++;
    k=a; // Зачем? Почему не использовать просто a
  }
// Промотал файл до конца, потом продолжил чтение - будут читаться одни -1!

 for (q=0,j=0;q<6,j<k;q++)      // Алгоритм XOR
// Не понял конструкцию q<6,j<k ? 
  {
   c=fgetc(f1);
   res[j]=c^data[q];
// Проксорил твой файл (точнее -1) с первыми 6ю байтами массива data, и далее по все памяти после него
   fputc(res[j],f2);
// А так же убил все, что лежит за пределами res после 50го обработанного байта
   j++;
 }
 printf("\n Finished"); // Это точно - finish, причем полный!
 fclose(f1);
 fclose(f2);
}


Цитата

А лучше работать в текстовом режиме или в бинарном? + если в бинарном режиме то вместо putc, getc будут другие функции, помоему, типо fwrite, fread я могу и ошибаться...

У тебя и так бинарный.

Цитата

Или дайте исходник, шифрования дешифрования файлов на С, очень надо ребята...

Возьми: ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.7.tar.bz2

Вот твой исходник (исправленный):

Код

#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
void main()
{
   char s[80];
   char data[6];
   int i,j,c;

   printf("Vvedite imya faila wufr/dewufr");
   gets(s);
   FILE*f1=fopen(s,"br");
   printf("\n kyda wufrovat'/dewufr ?");
   gets(s);
   printf("\n Please Enter password");
   for (i=0;i<6;i++)  // на экране отображаются звёздочки и пароль записал в массив
    {
     ch=getch();
     if (ch=='\r' || ch=='\n') break;
     data[i]=ch;
     printf("*");
   }
  printf("\n"); 
  FILE*f2=fopen(s,"bw");

  j=0;
  while ((c=fgetc(f1))!=EOF) 
   {
    fputc(c^data[(j++)%i],f2);
   }
  printf("Finished\n");
  fclose(f1);
  fclose(f2);
}





Автор: tommy256 29.11.2007, 18:18
to xvr: Respect и уважуха smile 
НО если открывать файл в бинарном режиме, то вместо fputc - fwrite, fgetc - fread, я писал выше, но я поставил в текстовый режим, шифрует текст, и расшифровует!
А можно шифровать рисунки, и другие файлы? Одного бинарного режима думаю мало... 

Автор: xvr 29.11.2007, 20:50
Цитата(tommy256 @ 29.11.2007,  18:18)
to xvr: Respect и уважуха smile 
НО если открывать файл в бинарном режиме, то вместо fputc - fwrite, fgetc - fread, я писал выше, но я поставил в текстовый режим, шифрует текст, и расшифровует!

fputc и fgetc будут работать и в бинарном режиме, собственно у тебя файлы изначально и открывались в бинарном режиме. Текст так шифровать тоже можно.

Цитата

А можно шифровать рисунки, и другие файлы? 

Можно

Цитата

Одного бинарного режима думаю мало...

Вполне достаточно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)