Kiberchief
@Kiberchief
Пока учусь.

Почему Шифр Виженера не работает для маленьких букв?

Помогите доделать шифр для маленьких букв
#include <iostream>
#include <string>
#include<algorithm>
#include<cctype>

using namespace std;


class Vigenere
{
public:
  string key;

  Vigenere(string key)
  {
    for(auto &i:key)
    {
      if(i >= 'A' && i <= 'Z')
        this->key += i;
      else if(i >= 'a' && i <= 'z')
        this->key += i;
    }
  }

  string encrypt(string text)
  {
    string out;
    int j=0;

    for(auto &i:text)
    {
      if(i==' '){
          out+=' ';
          continue;
      };

      if(isupper(i))
       out += (i + key[j] - 2*'A') % 26 + 'A';
        else
      out += (i + key[j] - 2*'A') % 26 + 'a';

      j = (j + 1) % key.length();
    }

    return out;
  }

  string decrypt(string text)
  {
    string out;
    int j=0;
    for(auto &i:text)
    {
      if(i==' '){
          out+=' ';
          continue;
      };

      if(isupper(i))
        out += (i - key[j] + 26) % 26 + 'A';
      else
      out += (i - key[j] + 26) % 26 + 'a';

      j = (j + 1) % key.length();
    }

    return out;
  }
};

using namespace std;

int main()
{
  Vigenere cipher("LEMON");

  string original= "ATTA cka";//Должно вывести -> LXFO pve
//  getline(cin,original);
  string encrypted = cipher.encrypt(original);
  string decrypted = cipher.decrypt(encrypted);

  cout <<"Text : "<< original << endl;
  cout << "Key: " << cipher.key << endl;
  cout << "Cipher: " << encrypted << endl;
  cout << "Decipher: " << decrypted << endl;
}
  • Вопрос задан
  • 570 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
if(isupper(i))
       out += (i + key[j] - 2*'A') % 26 + 'A';
        else
      out += (i + key[j] - 2*'A') % 26 + 'a';

В первом случае у вас i - большая буква, key[j] - большая буква, поэтому вы вычитаете две буквы A.
В первом случае у вас i - маленькая буква, key[j] - большая буква, а вы продолжаете вычитать две буквы A.
Правильнее чуть сгруппировать, чтобы было понятно зачем вы отнимаете:
out += ((i - 'A') + (key[j] - 'A')) % 26 + 'A';
И тогда сразу станет видно, что в случае с маленькой буквой нужно:
out += ((i - 'a') + (key[j] - 'A')) % 26 + 'a';

NB: i - плохое имя для переменной типа char. Когда программист видит i он подразумевает цикловую числовую переменную.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы