archivo para junio, 2010

El cifrado César o por desplazamiento es una de las formas más simples de ocultar mensajes, aunque también una de las más fáciles de descifrar. El método no tiene más misterio que desplazar cada letra un número determinado de posiciones dentro del alfabeto de forma cíclica, es decir, si se llega al final se vuelve a empezar por el principio. Por ejemplo, con un desplazamiento de 3 posiciones a la derecha.

Alfabeto sin cifrar: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ.
Alfabeto cifrado: DEFGHIJKLMNÑOPQRSTUVWXYZABC.

Texto sin cifrar: Estoy leyendo Okashini
Texto cifrado:
Hvwrb ohbhqgr Rndvklql

El origen del cifrado lo encontramos hace más de 2.000 años. Corría el siglo I a.C cuando Julio César utilizó este cifrado con un desplazamiento de 3 posiciones a la derecha para ocultar mensajes en tiempos de guerra.

El descifrado es igual de sencillo si se conoce el número de desplazamientos que hay que realizar. Si no se conoce hay que trabajar algo más, aunque solamente habría que probar todas las combinaciones posibles, probando las primeras palabras hasta encontrar alguna frase coherente, y después traducir todo el texto. Podrían parecer demasiadas combinaciones, pero en el caso de nuestro alfabeto actual son solamente 27 posibilidades, pocas en comparación con otros cifrados. ¿Os imagináis que hubiera la misma cantidad que kanjis japoneses o hanzis chinos?

  • Vjkf vj le kvokf tzwiruf r kirmvj uvc dvkfuf Tvjri tfe 43 gfjztzfevj uv uvjgcrqrdzvekf r cr uvivtyr.

¿Podéis descifrarlo?

Como curiosidad, este cifrado se utiliza para otros más complejos como el de Vigenère.

¿Conocéis otros sistemas de cifrado?

Para los más técnicos, os dejo un programa en C++ que codifica textos.

// Cifrado César
// No se cifran letras con tilde, ñ, ç, ...

#include <iostream>
#include <string>
using namespace std;

void cesar(const string& s, int n) {
    for(int i = 0; i < s.size(); ++i) {
        char c = s[i];
        if(c >= 'a' and c <= 'z') {                         // Minúsculas
            if(c+n>'z') cout << char('a'+c+n-'z'-1);
            else cout << char(c+n);
        }
        else if(c >= 'A' and c <= 'Z') {                    // Mayúsculas
            if(c+n>'Z') cout << char('A'+c+n-'Z'-1);
            else cout << char(c+n);
        }
        else cout << c;
    }
}

int main() {
    int n;                  // Número de posiciones a desplazar
    cin >> n;
    n %= 26;
    string s;
    while(cin >> s) {
        cesar(s, n);
        cout << ' ';
    }
    cout << endl;
}
Etiquetas: ,

Comments Sin comentarios »