Шифрование файла(метод решетки) - C (СИ)

  1. Задание такое. Задан текстовый файл.Подсчитать сумму встречающихся в нем чисел(числа обособляются пробелами).Зашифровать файл методом решетки. Про шифрование,честно говоря,даже не слышал,интересно как это выглядит на деле.Надеюсь на вашу помощь.


textual

Код к задаче: «Шифрование файла(метод решетки) - C (СИ)»

cg.exe e mask.txt src.txt enc.txt
cg.exe d mask.txt enc.txt dec.txt

СДЕЛАЙТЕ РЕПОСТ

6   голосов, оценка 4.333 из 5



Похожие ответы
  1. Подскажите пожалуйста. не могу сделать чтобы буквы менялись. только вывела слова на экран Пусть на экран выведены следующие три слова: «mathematic», «physic», «hemi».Если первое слово содержит нечетное количество букв, то в качестве первого символа в строку <результат> записать букву, которая в алфавите следует через три позиции за буквой, являющейся средним символом третьего слова; если это буква «z», записать «а». Если же первое слово содержит четное количество символов, то в качестве первого символа записать букву, которая в алфавите предшествует букве, являющей¬ся первым из двух средних символов первого слова; если это буква «а», запи¬сать «z». не нужно исправлять никакие ошибочки если они есть, просто помогите сделать вторую часть задания вот мой кодC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include #include   int main(int argc, char *argv[]) { int i,SIZE,kol; char x[10]={'m','a','t','h','e','m','a','t','i','c'}; char y[6]={'p','h','y','s','i','c'}; char e[4]={'h','e','m','i'}; char a[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; printf ("mathematic",x); printf ("\nphysic",y); printf ("\nhemi\n",e); for(i=0;i

  1. Здравствуйте! Помогите доработать прогу на си. Она должна шифровать (хотя бы!!!) и дешифровать текст методом Виженера:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include #include #include #include   int main(int argc, char *argv[]){ setlocale(LC_ALL, "RU"); int const kol=27; char table[26]="abcdefghijklmnopqrstuvwxyz"; char buf[26][26]; int i=0, j=0, k; fflush(stdin); for(int i=0; i=kol) k=k-kol;                 if((i>=1&&k==0)||(i>=2&&k==1)||(i>=3&&k==2)||(i>=4&&k==3)||(i>=5&&k==4)||(i>=6&&k==5)||(i>=7&&k==6)||(i>=8&&k==7)||(i>=9&&k==8)||(i>=10&&k==9)||(i>=11&&k==10)||(i>=12&&k==11)||(i>=13&&k==12)||(i>=14&&k==13)||(i>=15&&k==14)||(i>=16&&k==15)||(i>=17&&k==16)||(i>=18&&k==17)||(i>=19&&k==18)||(i>=20&&k==19)||(i>=21&&k==20)||(i>=22&&k==21)||(i>=23&&k==22)||(i>=24&&k==23)||(i>=25&&k==24)||(i>=26&&k==25)) buf[i][j-1]=table[k];                 else buf[i][j]=table[k];         } }  for(int i=0; i<26; i++){     for(int j=0; j<26; j++){             printf("%c",buf[i][j]);         }         printf("\n");   } char text[250], key[250], shifr[250]; printf ("Введите ключ: ");     for(int i=0; i<3; i++){         scanf("%c", key);     } printf ("Введите текст: ");         for(int i=0; i<6; i++){                 scanf("%c", shifr);         }     int M_shifr, M_key, p=0, p1=0;     for(int t=0; tstrlen(key)) p1=0;                         while(j!=kol){                                 if(buf[i][0]==key[p1]){                         M_key=j; p1++;                     }                                 else j++;                         }                 text[t]=buf[M_shifr][M_key];         } }

  1. Написал небольшу програмку для шифрования и расшифровывания сообщений. 1 - Программа должна сгенерировать random prime number 2 - Проверить - prime or not 3 - Создать ключи используя наши два сгенерированные номера и плюс добавляем еще один (сами) 4 - Зашифровать сообщение и передать в файл 5 - Расшифровать это же сообщение и тоже передать в файл. Все работает, составлен примитивный диалог, но как доходит до шифрования и расшифровки - прога начинает выдавать фигню, хотя вроде шифрование проходит нормально. КодC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 #include   // main labrary #include // required for randomize() and random() #include // required _getch() - pause #include // Just in case  - I will use diff math testes #include #include #include   // .............................................................................. //using namespace std; //void init_mm( ); //int number_range( int from, int to ); //int number_mm( void ); //int getprimeNumber(int From, int To, bool checkIt); //bool isprime(int num); //void generatePN();   //void startProg(); //bool checkForErrors(int L, int H);   //static    int rgiState[2+55]; // leave this alone // .................................................................................     int phi, m, n, e, i, j, r1, r2, p, q, d, ch;   long long int square(long long int a); long long int BigMod(int M, int E, int N); void encrypt(int l, int E, int N); void decrypt(int E, int N);   long long int BigMod(int b, int p, int m) {     if(p == 0)         return 1;     else if(p%2 == 0)         return square(BigMod(b, p/2, m)) % m;     else         return (((b % m) * BigMod(b, p-1, m)) % m); }   long long int square(long long a) {     return a*a; }   void encrypt(int m, int e, int n) {     FILE * fp;     fp = fopen("cipher_text.txt", "a");     int c = BigMod (m, e, n);     printf("%d ", c) ;     fprintf(fp,"%d ", c);     fclose(fp); }   void decrypt(int  d, int n) {     FILE * fp;     fp = fopen("plaine_text.txt", "a");     while(1)     {         int c;         fscanf(fp,"%d", &c);         if(c==-1) break;         int m=BigMod(c, d, n);         printf("%c", m);     } }   ///////////////////////////////////////////////////////////////////////////////////////////////   int IsPrime(unsigned int number) {     if (number <= 1) return 0; // zero and one are not prime     unsigned int i;     for (i=2; i*i<=number; i++)     {         if (number % i == 0) return 0;     }     return 1; }   void generate_two_primes() // Start to generate two prime numbers N times (is need) {     int seed = time(NULL);     srand(seed);     unsigned int r;     printf("Generating first number ");     do     {         printf(".");         r = rand() % 1000;             // Genertate random number as r     }     while(IsPrime(r) == 0);     r1 = r;       printf("\nGenerating second number ");     do     {         printf(".");         r = rand() % 1000;             // Genertate random number as r     }     while(IsPrime(r) == 0);     r2 = r;   } ////////////////////////////////////////////////////////////////////////////////////                                                                                                      int main(void) { // ..................................... Generate a 2 random numbers .........................................     printf("\n\nAwaiting, the random numbers generate...\n\nPleese click Enter to generate \n\n");  // Start dialog       _getch();                          // Create pause ..       generate_two_primes();   // .................................... Finish random numbers .................................................   // .................................... Check on the Prime number ..............................................     printf(".........................................................................\n\n");     printf("For check first number %d and second number %d\nas a Prime Number please click Enter\n\n", r1, r2);       _getch();                          // Create pause       j = 2, ch = 0;  // ...................... Check First number ............ //     while(j <= r1/2)     {          if(r1 % j == 0)         {            ch = 1;            break;         }         else         {             j++;         }     }       if(ch == 0)     {         printf("The number %d is prime\n\n", r1);     }       else       {         printf("The number %d is not prime\n\n", r1);     } // ...................... Check second number .............. //     while(j <= r2 / 2)     {           if(r2 % j == 0)         {             ch = 1;             break;         }           else           {             j++;         }     }       if(ch == 0)     {         printf("The number %d is prime\n\n", r2);     }       else     {         printf("The number %d is not prime\n\n", r2);     }     printf(".........................................................................\n\n"); // ....................................... Finish check Prime number .............................   // ............................ Work with Public and Privat key ..................................     printf("We have a two large numbers %d and %d\n", r1, r2);     printf("Now we will calculate Public key and Privat key, please type ANY number\n\n"); // ................... Change integers on the formula letters     p = r1;           // Change letter on the standard letter for furmula p     q = r2;           // Change letter on the standard letter for furmula q     n = p * q;        // Calculate n // .......................................................... Change letters     scanf("%d", &e);                      // Add more one number         phi = (p-1)*(q-1);     // Putput result on calculation     printf("\nPublic key ( e , n ) : ( %d %d )\n\nPlease click Enter to calculate Privat key\n\n", e, n);     _getch();                          // Create pause       int d, RES = -1;       for (d = 1;; d++)     {         RES = (d*e) % phi;         if (RES == 1) break;     }       printf("Private Key ( d ) : ( %d )\n", d);     printf("\n\nPlease click Enter for cont...\n\n");       _getch();                          // Create pause // ........................................... Finish genertae Public and Privat key ............         printf("Please input your string here : ");     char arr[1000000];     fflush(stdin);     gets(arr);     int i;     FILE * fp=fopen("plaine_text.txt", "a");     fclose(fp);     for(i = 0; arr[i]; i++)     {         int ASCII=arr[i];         encrypt(ASCII, e, n);     }       printf("\n");     FILE *fpp = fopen("cipher_text.txt", "a");     //fprintf(fp, "-1");     fclose(fpp);     decrypt(d, n);         getchar();   }Запускаем prob_01.jpg Вроде все нормально, но откуда отрицательное число? prob_02.jpg Результат.... Где недочеты??? По возможности выправите код.... устал уже с прогой.

  1. C1 2 3 4 5 6 7 8 9 10 #include #include   int main() {char i=0;     scanf ("%c",&i);     i=i+1;     printf("%c",i);     getch();     }программа изменяет букву на +1 знак, нужно чтобы такая замена происходила не с одной буквой, а с строкой, вот нашел программу, как именно вписать сюда этот +1C1 2 3 4 5 6 7 8 9 10 11 #include #include   int main() {     const int SIZE = 255;     char str[SIZE];     fgets(str, SIZE, stdin);     printf("%s", str);     getch(); }

  1. Доброго времени суток! Помогите решить задачу. даже наброски сделать не получается. задача: Ввести с клавиатуры строку зашифрованного текста. Расшифровать строку и вывести результат на экран. Шифрование было выполнено путем замены символа на его порядковый номер в алфавите в виде XXX (число из 3-х цифр, например 001, 010, 100).

  1. Помогите пожалуйста, очень срочно. Моя задача реализовать алгоритм шифрования Blowfish. Шифрование файлов/папок. В переменные high, low подаётся информация по 32 бита (4 байта), я понимаю, что в чём проблема взять ф-цию fread и считывать, но как правильно это сделать, т.к. если у нас в конце получается остается меньше 4 байт информации мы должны заполнить недостающее место НУЛЯМИ, или другим заранее известным способом. Помогите реализовать функцию которая к примеру будет открывать файл и считывать в эти переменные 4 байта. И ещё один вопрос, я хочу зашифровать каталог с файлами и подкаталогами, всё это делаю при помощи FindFirstFile, FindNextFile (это я знаю), по идее я должен зашифрованный вариант записать в один файл, но как при расшифровки восстановить каталоги, подскажите.C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 #include #include #include #include #include   typedef struct _blowfish_ctx {     unsigned long P[18];     unsigned long sbox[4][256]; }blowfish_ctx;   //Матрица подстановки const unsigned int FIXED_S[4][256] = {     {0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,     0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,    //....256 пропустил для экономии места     0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,     0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,     0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6}     };   //Ключи шифрования const unsigned long FIXED_P[] = {     0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,     0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,     0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,     0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,     0x9216D5D9, 0x8979FB1B};     void swap(unsigned long *a, unsigned long *b) {     unsigned long temp;       if(a && b)         temp = *a, *a = *b, *b = temp; }   //Функция F(x) unsigned long F(blowfish_ctx *S, unsigned long x) {     return ((S->sbox[0][(x >> 24) & 0xFF] + S->sbox[1][(x >> 16) & 0xFF]) ^ S->sbox[2][(x >> 8) & 0xFF]) + S->sbox[3][(x) & 0xFF]; }   //Дешифрование void blowfish_decrypt_block(blowfish_ctx *ctx, unsigned long *high, unsigned long *low) {     int i;       for(i = 17; i > 1; i--)     {         *high ^= ctx->P[i];         *low ^= F(ctx, *high);         swap(low, high);     }       swap(low, high);     *high ^= ctx->P[0];     *low ^= ctx->P[1]; }   //Шифрование void blowfish_encrypt_block(blowfish_ctx *ctx, unsigned long *high, unsigned long *low)//high,low - {                                                                                      //левый и правый блоки     int i;       for(i = 0; i < 16; i++) //шифрование 16 раундов     {         *high ^= ctx->P[i];     //XOR-им high с кючами P[i]         *low ^= F(ctx, *high);  //XOR low и F(x)         swap(low, high);        //Меняем местами     }       swap(low, high);     *low ^= ctx->P[16];         //17-й     *high ^= ctx->P[17];        //и 18-й ключ XOR-ся с выходными блоками последнего раунда }   int blowfish_init(blowfish_ctx *ctx, unsigned char *key, size_t key_len) {     int i, j;     unsigned long k, l;     unsigned long long_key;       if(ctx && key && key_len > 0 && key_len <= 56)     {         memcpy(ctx->P, FIXED_P, 18 * sizeof(FIXED_P));           for(i = 0; i < 4; i++)             memcpy(ctx->sbox[i], FIXED_S[i], sizeof(FIXED_S[i]));           for(i = 0, k = 0; i < 18; i++)         {            for(j = 0, long_key = 0; j < 4; j++, k++)                 long_key = (long_key << 8) | key[k % key_len];             ctx->P[i] ^= long_key;         }           for(i = 0, k = 0, l = 0; i < 18; i++)         {             blowfish_encrypt_block(ctx, &k, &l);             ctx->P[i] = k;             ctx->P[++i] = l;         }           for(i = 0; i < 4; i++)         {             for(j = 0; j < 256; j++)             {                 blowfish_encrypt_block(ctx, &k, &l);                 ctx->sbox[i][j] = k;                 ctx->sbox[i][++j] = l;             }         }         return 0;     }       return -1; }   int SeachFile(char *file) {     char buffer[5] = "";       FILE *f = fopen(file, "r");       if(f == NULL)         return 0;       while(feof(f) == 0)     {         fread(&buffer, 4, 1, f);                printf("%s", buffer);         fread(&buffer, 4, 1, f);         printf("%s", buffer);     }       return 1; }   int main(int argc, char **argv) {     setlocale(LC_ALL, "RU");     blowfish_ctx *ctx = (blowfish_ctx *)malloc(sizeof(blowfish_ctx));     unsigned long high = 1, low = 6556;       if(!ctx)     {         puts("Insufficient memory allocated");         return -1;     }       if(blowfish_init(ctx, (unsigned char *)"TESTKEY", 7) != 0)     {         free(ctx);         puts("Key initialization failed");         return -1;     }       SeachFile("blowfish.obj");       blowfish_encrypt_block(ctx, &high, &low);     printf("Шифрование: Верхний 32 bits:%08X Нижний 32 bits:%08X\n", high, low);     blowfish_decrypt_block(ctx, &high, &low);     printf("Дешифрование: Верхний 32 bits:%08X Нижний 32 bits:%08X\n", high, low);     free(ctx);       return 0; }в строке unsigned long high = 1, low = 6556; это пример шифрования значений 1 и 6556

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include   unsigned long get_size_by_fd(int fd) {     struct stat statbuf;     if (fstat(fd, &statbuf) < 0)     {         return 1;     }     return statbuf.st_size; }   int main(int argc, char **argv) {     char filename[1024];     AES_KEY key = { 0 };     enum     {         none = 0,         enc = 1,         dec = 2     } mode = none;       char password[256] = { 0 };     uint8_t pswmd5[16];       FILE * fp1 = 0;     FILE * fp2 = 0;       uint8_t plain_text[1024] = { 0 };     uint8_t enc_text[1024] = { 0 };     size_t cbdec;     size_t cbenc;       int i;     int status;     int file_descript;     unsigned long file_size;       for (i = 1; i < argc; ++i)     {         if (strcmp(argv[i], "--help") == 0)         {             printf("usage: %s \n", basename(argv[0]));             printf("mode : {-enc|-dec}\n");             return 0;         }           if (strcmp(argv[i], "-enc") == 0)         {             mode = enc;         }         else if (strcmp(argv[i], "-dec") == 0)         {             mode = dec;         }         else if (*filename)         {             strncpy(filename, argv[i], sizeof(filename) - 4);         }         else         {             printf("invalid argument %s\n", argv[i]);             return -1;         }     }       if (!*filename)     {         printf("no filename provided\n");         return -1;     }       if (mode == none)     {         printf("no mode provided\n");         return -1;     }       printf("enter password:");     if (scanf("%255s", password) != 1)     {         printf("input error\n");         return -1;     }       if (strlen(password) < 6)     {         printf("password bad: too short\n");         return -1;     }       MD5(password, (strlen(password) + 1), pswmd5);       status = AES_set_encrypt_key(pswmd5, 16 * 8, &key);     printf("AES_set_encrypt_key(): status=%d\n", status);       fp1 = fopen(filename, "rb");     if (!fp1)     {         printf("can't open file '%s': %s\n", filename, strerror(errno));         return -1;     }       file_descript = open(filename, O_RDONLY);     file_size = get_size_by_fd(file_descript);       strcat(filename, mode == enc ? ".enc" : ".dec");     fp2 = fopen(filename, "wb");     if (!fp2)     {         printf("can't open file '%s': %s\n", filename, strerror(errno));         fclose(fp1);         return -1;     }       if (mode == enc)     {         while ((cbenc = fread(plain_text, 1, sizeof(enc_text) - 16, fp1)) > 0)         {             if (cbenc % 16 != 0)             {                 cbenc = (cbenc / 16 + 1) * 16;             }               AES_encrypt(plain_text, enc_text, &key);               if (fwrite(enc_text, 1, cbenc, fp2) == 0)             {                 fprintf(stderr, "can't write to file '%s': %d (%s)", filename,                         errno, strerror(errno));                 break;             }         }       }     else     {         while ((cbdec = fread(enc_text, 1, sizeof(enc_text), fp1)) > 0)         {             if (cbdec % 16 != 0)             {                 cbdec = (cbdec / 16 + 1) * 16;             }               AES_decrypt(enc_text, plain_text, &key);               if (fwrite(plain_text, 1, cbdec, fp2) == 0)             {                 fprintf(stderr, "can't write to file '%s': %d (%s)", filename,                         errno, strerror(errno));                 break;             }         }     }       fclose(fp2);     fclose(fp1);     return 0; }Не удается расшифровать файл

  1. Подскажите правильно ли у меня реализованна функция шифрованияC1 2 3 4 5 6 7 8 9 #define SIZE_OF_KEY 10 char Key[10]={'a','w','a','c','u','a','w','a','c','u'};   char crypt(char data){    static char i;    char result=data^Key[i++];    if(i>=SIZE_OF_KEY)i=0;   return result; }а то бывает обрывается крипт или добавляется, что то лишнее, потом не могу раскодировать полность пол строки раскодирует половину нет.

  1. Добрый день, помогите пожалуйста написать программу на Си, которая шифрует и дешифрует слова в XOR-шифрованием Есть код на С++, если можете, то помогите изменить этот код для Си:C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include #include   using namespace std;   string encode(char word[], char key[]) {     char* res = new char[strlen(word)];         for (int i = 0; i < strlen(word)-1; i++)         res[i] = word[i] ^ key[i];       return res;   }   int main() {     cout << encode("Andrew", "BsFGgE");       while (true);     return 0; }