Вот код C для Vernam Cipher, как принимать цифры в качестве входного сообщения вместо строк? - PullRequest
0 голосов
/ 02 марта 2019
#include <stdio.h>

char arr[26][26];
char message[22], key[22], emessage[22], retMessage[22];
int findRow(char);
int findColumn(char);
int findDecRow(char, int);

int main() {
    int i = 0, j, k, r, c;
    clrscr();
    k = 47;
    for (i = 0; i < 10; i++) {
        k++;
        for (j = 0; j < 10; j++) {
            arr[i][j] = k++;
            if (k == 59) 
                k = 48;
        }
    }
    printf("\nEnter message\n");
    gets(message);
    printf("\nEnter the key\n");
    gets(key);
    // Encryption 
    for (i = 0; key[i] != NULL; i++) {
        c = findRow(key[i]);
        r = findColumn(message[i]);
        emessage[i] = arr[r][c];
    }
    emessage[i] = '\0';
    printf("\n Encrypted message is:\n\n");
    for (i = 0; emessage[i] != NULL; i++) 
        printf("%c", emessage[i]);
    //decryption 
    for (i = 0; key[i] != NULL; i++) {
        c = findColumn(key[i]);
        r = findDecRow(emessage[i], c);
        retMessage[i] = arr[r][0];
    }
    retMessage[i] = '\0';
    printf("\n\nMessage Retrieved is:\n\n");
    for (i = 0; retMessage[i] != NULL; i++) 
      printf("%c", retMessage[i]);
    getch();
    return (0);
}

int findRow(char c) {
    int i;
    for (i = 0; i < 26; i++) {
        if (arr[0][i] == c) 
           return (i);
    }
}

int findColumn(char c) {
    int i;
    for (i = 0; i < 26; i++) {
        if (arr[i][0] == c) 
           return (i);
    }
}

int findDecRow(char c, int j) {
    int i;
    for (i = 0; i < 26; i++) {
        if (arr[i][j] == c) 
           return (i);
    }
}

это программа Vernam Cipher, используемая для шифрования и дешифрования данных с использованием ключа.Проблема в том, что эта программа не может принимать цифры в качестве входных данных.как отредактировать это так, чтобы мы могли взять цифры в качестве входных данных и зашифровать их?нет необходимости менять ключ, только цифры message необходимо изменить на цифры.А также выходные данные, т.е. Message Retrieved должны быть также цифрами, поскольку мы расшифровываем данные.

1 Ответ

0 голосов
/ 02 марта 2019

Примечание. Разве это не Vigenère (не Vernam)?

Если это Vigenère, вам просто нужно правильно определить, какой у вас входной алфавит.На самом деле в вашем коде есть строчные буквы алфавита (az), поэтому код Vigenère выглядит примерно так:

 abcdefghijklmnopqrstuvwxyz
aabcdefghijklmnopqrstuvwxyz
bbcdefghijklmnopqrstuvwxyza
ccdefghijklmnopqrstuvwxyzab
...

Просто добавьте свои цифры в любом месте кода:

 abcdefghijklmnopqrstuvwxyz0123456789
aabcdefghijklmnopqrstuvwxyz0123456789
bbcdefghijklmnopqrstuvwxyz0123456789a
ccdefghijklmnopqrstuvwxyz0123456789ab
...

--- EDIT ---

Вам может понадобиться добавить еще один небольшой слой, который позволит вам определить свой входной алфавит.Итак, определите массив, содержащий все рассматриваемые буквы в заданном порядке (выберите одно), скажем:

Alphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz";

Теперь представьте, что у вас есть функция, в которой заданная буква даст вам ранг в алфавите: скажем, rank(l), например rank('b')=11.

Теперь вычислите (нет необходимости в такой структуре, но давайте сделаем это, как вы) ваши перестановки:

Perms[][]
   00 01 02 03 04 05 .... 35
00 00 01 02 03 04 05 .... 35
01 01 02 03 04 05 .... 35 00
02 02 03 04 05 .... 35 00 01
...

Теперь для заданной ключевой буквыk и письмо с письмом l Вы можете вычислить зашифрованную букву e как:

e = Alphabet[Perms[rank(l)][rank[k]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...