对此我有麻烦。我为“ 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;
}
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您想使用自定义字母而不是英语字母。例如,您可以添加数字。
您必须对数字进行操作,而不是实际的字母:0, 1, 2, ... N-1
,其中N
是字母的大小。对于英语字母,这意味着您必须使用0
代替A
(0x41
),1
代替B
(0x42
).. 。25
而不是Z
。
如果密钥的大小为M
,则位置i
上的字母的加密算法为:
( L[i] + K[i mod M] ) mod N
一旦您有了一种对数字进行运算的功能算法,您要做的就是将输入的内容从字母映射到数字,并将的输出结果从数字映射到字母。 / p>
将数字映射到字母很容易;您只需要将字母存储为字符串– 这可以回答您的问题:
string n_to_letter; // alphabet
//...
int main()
{
//...
cin >> n_to_letter; // read the alphabet
//...
将字母映射为数字可能是您目前所不了解的;您必须使用 map
:
#include <map>
//...
string n_to_letter; // alphabet
map< char, int > letter_to_n;
void init_letter_to_n() //...
如果您不知道如何使用地图,则可以使用解决方法:只需在字母字符串中搜索字母,或使用256个字符的向量/字符串。
< / li>