Некоторые дополнительные символы печатаются в конце расшифрованного сообщения - PullRequest
0 голосов
/ 03 марта 2019
#include<stdio.h>
char arr[75][75];
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;
  k = 47;
  for (i = 0; i < 75; i++) {
    k++;
    for (j = 0; j < 75; j++) {
      arr[i][j] = k++;
      if (k == 123)
        k = 48;
    }
  }
  printf("\nENTER MESSAGE TO ENCRYPT\n");
  gets(message);
  printf("\nENTER THE KEY TO ENCRYPT THE MESSAGE\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("\nENCRYPTED 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 DECRYPTED IS (ORIGINAL MESSAGE):\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 < 75; i++) {
    if (arr[0][i] == c)
      return (i);
  }
}

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

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

Вот мой код для шифрования и дешифрования сообщения с использованием Vernam Cipher.все работает нормально, кроме дешифровки.некоторые дополнительные символы печатаются в конце расшифрованного сообщения.например:

 Message: 571635
 key: BYUg872e78
 Cipher: G`Vm;<
 Decrypted Msg: 571635a
 Expected msg: 571635

В конце расшифрованного сообщения печатается дополнительный символ 'a'.
Как исправить это в моем коде?

Ответы [ 2 ]

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

Ваша кодировка и декодирование не работает.Вам не нужно, чтобы ключ и сообщение были одинаково длинными.

Если ваш ключ короче сообщения, вы кодируете только часть сообщения.Затем вы завершаете результат в этой позиции.Помимо потери части сообщения, пока все в порядке.

Если ваш ключ длиннее сообщения, вы пытаетесь закодировать символы из сообщения, которое не было введено пользователем.Сначала вы попытаетесь закодировать завершающий '\0' после последнего символа сообщения.Это не удастся, потому что findcolumn не возвращает правильное значение и вызывает неопределенное поведение.Вы, вероятно, сохраните некоторый «случайный» символ в своем зашифрованном сообщении.Аналогично для любого другого символа в сообщении.

При декодировании вы пытаетесь декодировать этот случайный контент, и маловероятно, что вы снова получите начальный '\0'.Вместо этого вы получаете «случайные» результаты декодирования.

Прослушивание предупреждений о невозможности возврата значения из функции non-void по крайней мере покажет вам, когда вы пытаетесь закодировать или декодировать какое-то подозрительное значение, и вы можете понять, почемуэто может произойти вообще.

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

Подсказка: что является возвращаемым значением findRow(c), когда c отсутствует в arr[]?

Ролловер для ответа

Включение всех предупреждений для экономии времени.

Вы можете получить что-то вроде

warning: control reaches end of non-void function [-Wreturn-type]

в конце findRow(), findColumn(), findDecRow()


Существуют другие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...