Предварительный анализ
Код символа 'H' равен 72.
(72 + 13)% 26 + 65 = 85% 26 + 65 = 7 + 65 ~ 'H'
Давайте посмотрим, будем ли мы сначала вычитать 65:
(72 - 65 + 13)% 26 + 65 = (7 + 13)% 26 + 65 = 20% 26 + 65 = 20 + 65= 85 ~ 'U'
Решение
printf("%c", ((plaintext[i] + key - 65) % 26) + 65);
и
printf("%c", ((plaintext[i] + key - 97) % 26) + 97);
соответственно.
Доказательство
Если у вас естькод символа, C, где S <= C <S + 26, тогда вы использовали следующую формулу: </p>
((клавиша C +)% 26) + S
, однако фактическаябуква L, и мы знаем, что
C = S + L,
, поэтому формула
((S + L + клавиша)% 26) + S
и, поскольку
(A + B)% C = ((A% C) + (B% C))% C,
с заменой A на (S),B с (L + клавиша) и C с 26, мы получаем:
((S% 26) + ((L + клавиша)% 26))% 26, мы видим, что результат искажается на (S% 26), что в случае 65 равно 13. Поскольку искажение 13 + ключ 13 вы использовали в модуле clзадница из 26 даст начальную букву!
Итак, предложенная новая формула
((C + key - S)% 26) + S = (((S + L) +клавиша - S)% 26) + S = ((L + клавиша)% 26) + S
- это именно то, что вам нужно.