我如何从用户那里获取字母

时间:2018-12-14 21:01:23

标签: c++ encryption vigenere

对此我有麻烦。我为“ vigenere密码”编写了代码。

我有文本和密钥。但是我想从用户那里获取字母。用户想要的内容,例如:“ 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 :(得分:1)

如果我正确理解了您的问题,那么您想使用自定义字母而不是英语字母。例如,您可以添加数字。

  1. 您必须对数字进行操作,而不是实际的字母:0, 1, 2, ... N-1,其中N是字母的大小。对于英语字母,这意味着您必须使用0代替A0x41),1代替B0x42).. 。25而不是Z

  2. 如果密钥的大小为M,则位置i上的字母的加密算法为:

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

    一旦您有了一种对数字进行运算的功能算法,您要做的就是将输入的内容从字母映射到数字,并将的输出结果从数字映射到字母。 / p>

  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个字符的向量/字符串。

    < / li>

DEMO