Вася написал свою программу для шифрования сообщений и зашифровал с ее помощью сообщение для своего друга Миши. Чтобы усложнить понимание программы, Вася запутал код и добавил использование пароля для осуществления операций шифрования и расшифрования.
Вася отправил Мише сообщение:
="+>j#9j+(%?>j%?8j'//>#$-u
и программу, а пароль отправить забыл. Однако Миша легко расшифровал сообщение без пароля.
Помогите Мише расшифровать сообщение и найти ключ.
Листинг программы приведен ниже.
Паскаль |
Си |
Uses crt; Var a, c, d, e: string; b: integer; Begin Clrscr; c:= ''; Writeln('Введите текст'); Readln(a); Repeat Writeln('Введите ключ'); Readln(d); Until length(d)>=6; Repeat b:= 1; If length(e)<length(a) then e:=e+d[b]; b:=b+1; Until length(e)>=length(a); For b:=1 to length(a) do c:=c+chr(byte(a[b]) xor byte(e[b])); For b:=1 to length(a) do write(c[b]); Writeln; Readln; End. |
#include <stdio.h> #include <string.h> void main() { char a[100]={0}, c[100]={0}, d[100]={0}, e[100]={0}; int b; printf("Введите текст: "); scanf("%s", a); do { printf("Введите ключ: "); scanf_s("%s", d, 100); } while(strlen(d) < 6); do { b = 0; if (strlen(e) < strlen(a)) e[strlen(e)] = d[b]; b++; } while(strlen(e) < strlen(a)); for (b = 0; b < strlen(a); b++) c[b] = a[b] ^ e[b]; for(b = 0; b < strlen(a); b++) printf("%c", c[b]); printf("\n"); } |
Анализируя цикл do .. while():
do
{
b = 0;
if (strlen(e) < strlen(a))
e[strlen(e)] = d[b];
b++;
}
можно сделать вывод, что чтрока-ключ (e) будет содержать копии символа d[b], при этом b = 0, и количество копий символа равно длине введенного ключа. Длина ключа определяется первым циклом do.. while, и равна 6.
В качестве ответа подойдет ключ из одинаковых символов, равных первому введенному символу, и длиной, равной длине введенного ключа.
Осталось перебрать всевозможные символы по ASCII-таблице и получить ответ.
Любой пароль длиннее 6 символов, который начинается на J