Как получить алфавит от пользователя - PullRequest
0 голосов
/ 15 декабря 2018

У меня проблема с этим.Я написал код для "Vigenere Cipher".

У меня есть текст и ключ.Но я хочу получить алфавит от пользователя.что хочет пользователь и т.д.: «abcdfgh» или «sdgfjdgkfdsgs», то, что хочет пользователь.

Итак, но я не могу этого сделать.

Как получить алфавит от пользователя?

Во-первых, я хочу получить алфавит от пользователя.После, я хочу, чтобы он ввел слово и зашифровал его.Но алфавит слов - это алфавит пользователя.

Here is the codes:
 #include <iostream>
 #include <string>
 using namespace std;

 // Bu fonksiyon bir key oluşturur.
  string generateKey(string str, string key) 
 {
 int x = str.size();

 for (int i = 0; ; i++)
  {
      if (x == i)
        i = 0;
      if (key.size() == str.size()) // eğer oluşturulan key boyutu girilen 
    metnin boyutuna eşitse fonksiyonu durdur.
        break;
    key.push_back(key[i]);
}
return key;
    }
    string cipherText(string str, string key) // "/Bu fonksiyon orjinal metni şifreler \"
      {
    string cipher_text;

   for (int i = 0; i < str.size(); i++)
  {
    // converting in range 0-25 
    int x = (str[i] + key[i]) % 26;

    // alfabeyi ASCII kodlarina dönüştür:
    x += 'A';

    cipher_text.push_back(x);
 }
       return cipher_text;
  }

    //  "/Bu fonksiyon şifreli metni orjinal hale getirir\"

      string originalText(string cipher_text, string key)
    {
string orig_text;

for (int i = 0; i < cipher_text.size(); i++)
{
    // converting in range 0-25 
    int x = (cipher_text[i] - key[i] + 26) % 26;

    // convert into alphabets(ASCII) 
    x += 'A';
    orig_text.push_back(x);
}
return orig_text;
       }
        int main()
          {
cout << " Sifrelenmesini istediginiz kelimeyi/cumleyi giriniz" << endl;
string str;
getline(cin, str);

//string str = "METINBUGRA";
cout << "Anahtar kelimeyi giriniz." << endl;
string keyword;
getline(cin, keyword);
//string keyword = "ABC";

string key = generateKey(str, keyword);
string cipher_text = cipherText(str, key);

cout << "Sifrelenmis Kelime : "
    << cipher_text << "\n";

cout << "Cozumlenmis kelime : "
    << originalText(cipher_text, key);
system("pause");
return 0;
   }

1 Ответ

0 голосов
/ 15 декабря 2018

Если я правильно понял ваш вопрос, вы хотите использовать собственный алфавит вместо английского алфавита.Например, вы можете добавить цифры.

  1. Вместо реальных букв вы должны работать с числами : 0, 1, 2, ... N-1, где N - это размер алфавита.Для английского алфавита это означает, что вы должны использовать 0 вместо A (0x41), 1 вместо B (0x42), ... 25 вместо Z.

  2. Если размер ключа M, алгоритм шифрования письма в позиции i:

    ( L[i] + K[i mod M] ) mod N

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

  3. Отображение цифр в буквы легко;вам просто нужно сохранить алфавит в строку - это отвечает на ваш вопрос :

    string n_to_letter; // alphabet
    //...
    int main()
    {
      //...
      cin >> n_to_letter; // read the alphabet
      //...
    
  4. Отображение букв в числа , вероятно, за пределамиваши текущие знания;Вы должны использовать map:

    #include <map>
    //...
    string n_to_letter; // alphabet
    map< char, int > letter_to_n;
    
    void init_letter_to_n() //...
    

    Если вы не знаете, как использовать карту, существует обходной путь : просто найдите буквув алфавитной строке или используйте вектор / строку длиной 256 символов.

DEMO

...