我正在控制台中进行vigenere加密。首先,我用37个字符的字母生成了随机位置。顺便说一句,我正在使用Visual Studio。我尝试了同学给我的其他消息和键,并且我的代码可以正常工作。我的意思是我使用他们给我的密钥从加密邮件中获得了原始邮件。
所有代码都有效,但是我在空格“”上存在问题,因为当我使用生成的密钥时,它将空格解释为“ a”(第一个字符),我一直在尝试教师给出的一些解决方案我,但即使她也不明白是什么问题。她是巴西的一名博士学位。我的成绩不错,因为显然代码应该可以正确运行。
int main()
{
string abecedario = "abcdefghijklmnopqrstuvwxyz0123456789 "; //la cadena que almacena el abecedario predeterminado
cout << abecedario.length();
string mensaje; //la cadena que almacenara el mensaje
cout << "Ingrese el mensaje: " << endl;
getline(cin, mensaje); //usamos el comando getline para ingresar el mensaje para tener el espacio tambien
int tam = mensaje.length();
srand(time(NULL));
int aleatorio;
vector <string> posiciones; //Esta cadena son las posiciones de las letras para tener, despues, el mensaje cifrado
for (int i = 0;i < tam;i++) {
aleatorio = (rand()+rand()+rand())%37; //generamos un numero aleatorio para posiciones sub i, dividido entre el tamaño del string para no exceder el limite
string alt = to_string(aleatorio); //transformamos el numero a un char
posiciones.push_back(alt); //insertamos el char en la cadena
}
cout << "Estas son las posiciones: " << endl;
for (int i = 0; i < tam; i++) {
cout << posiciones[i] << " " ;
}
cout << endl;
string clave = ""; //la clave del string la iniciamos en una cadena vacia
for (int i = 0;i < tam;i++) {
int temp;
stringstream pos(posiciones[i]);
pos >> temp;
clave = clave + abecedario[temp];
}
cout << "La clave es: " << endl << clave << endl;
int* arrow = new int[tam]; //creamos un arreglo de enteros para almacenar
for (int i = 0;i < tam;i++) {
int n1;
int n2;
for (int k = 0; k < abecedario.size();k++) {
if (abecedario[k] == mensaje[i]) { // recorremos el abecedario y recorremos los valores hasta que este sea igual a mensaje sub i
n1 = k; // si la anterior condicion es verdadera igualamos n1 a esa parte de la cadena
}
}
for (int t = 0; t < abecedario.size();t++) {
if (abecedario[t] == clave[i]) { // usamos la misma iteracion anterior, pero en vez de mensaje sub i, lo comparamos con clave sub i
n2 = t; // esta vez si la condicion se cumple igualamos n2 a esa parte de la cadena
}
}
if (n1 + n2 < 37) {
arrow[i] = (n1 + n2);// almacenamos la suma de n1 y n2 en arrow
}
else {
arrow[i] = (n1 + n2) - 36;
}
}
string mensajeCifrado = ""; // creamos un string para almacenar el mensaje cifrado
for (int i = 0;i < tam;i++) {
int l = arrow[i]; // igualamos una variable l a arrow sub i
mensajeCifrado = mensajeCifrado + abecedario[l]; // almacenamos en mensajeCifrado el caracter abecedario sub l
}
cout << "El mensaje cifrado es: " << endl;
cout << mensajeCifrado;
string mensajeNuevo = "";
for (int i = 0; i < mensajeCifrado.length();i++) {
int pos1;
pos1 = abecedario.find(mensajeCifrado[i]) - abecedario.find(clave[i]);
if (pos1 < 0) {
mensajeNuevo = mensajeNuevo + abecedario[pos1+36];
}
else{
mensajeNuevo = mensajeNuevo + abecedario[pos1];
}
}
cout << endl << "Este es el mensaje: " << endl;
cout << mensajeNuevo;
}