Prueba así:
Código PHP:
string Vigenere::cifrar(string orig, string sem){
string final;
int i, rotacion, total;
int pos, pos2;
//Las variables serviran para registrar la posicion
//de las letras y calcular la semilla
this->texto = limpiar(orig);
this->semilla = limpiar(sem);
for(i=0; i < texto.length(); i++){
rotacion = i%semilla.length();
pos = letras.find(texto.at(i));
pos2 = letras.find(semilla.at(rotacion));
total = (pos+pos2)%letras.length();
//El total que marca la posicion de la letra y la
//semilla sumadas
final.append(letras, total, 1);
}
return final;
}
string Vigenere::descifrar(string orig, string sem){
//La funcion es exactamente la misma que en el metodo
//cifrar, solo que aqui las posiciones se restan para
//eliminar la semilla del texto
string final;
int i, rotacion, total;
int pos, pos2;
this->texto = limpiar(orig);
this->semilla = limpiar(sem);
for(i=0; i<texto.length(); i++){
rotacion = i%semilla.length();
pos = letras.find(texto.at(i));
pos2 = letras.find(semilla.at(rotacion));
total = (letras.length() + pos - pos2) % letras.length();
final.append(letras, total, 1);
}
return final;
}
Saludos.
PD/ Cuidado con la salida por consola, algunos caracteres pueden salir cambiados.