У меня проблема с этим. Я написал код для «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;
}
Если я правильно понял ваш вопрос, вы хотите использовать собственный алфавит вместо английского алфавита. Например, вы можете добавить цифры.
Вместо реальных букв вы должны оперировать числами: 0, 1, 2, ... N-1
, где N
это размер алфавита. Для английского алфавита это означает, что вы должны использовать 0
вместо A
(0x41
), 1
вместо B
(0x42
), … 25
вместо Z
,
Если размер ключа M
Алгоритм шифрования письма в позиции i
является:
( L[i] + K[i mod M] ) mod N
Если у вас есть функциональный алгоритм, который работает с числами, все, что вам нужно сделать, это сопоставить ваш ввод от букв до цифр и ваш вывод из цифр в буквы.
Отображение цифр в буквы легко; Вы просто должны хранить алфавит в строку — это отвечает на ваш вопрос:
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 символов.
Других решений пока нет …