[pseint] Ayuda - Cifrado César

Iniciado por shadowzgz, 23 Diciembre 2014, 19:43 PM

0 Miembros y 1 Visitante están viendo este tema.

shadowzgz

Hola buenas,
necesito acabar un trabajo con pseint y me están surgiendo algunos problemillas.
El último ejercicio que me queda es el de hacer un Cifrado César . Es dejo el enunciado: "Rellenar una cadena texto, con un mínimo de 10 palabras, y mostrar el texto cifrado con el método Cesar o cifrado por desplazamiento."
No me malinterpretéis, no busco que alguien me lo haga, pero llevo unos días y no se como hacerlo.
Alguna ayuda? Mi problema básicamente es como convertir una A en una D, una B en una E, y así sucesivamente. ¿Necesito crear una tabla con cada una de las letras del abecedario? Tengo un lio....  :huh: ¿Cómo lo harías vosotros?

Gracias de antemano xD

ivancea96

Generalmente, para el cifrado César, se le suma la clave a cada letra de la cadena. Es decir, 'a' + 3 = 'd'. (En caso de que el número supere la 'z', se le restaría el número de letras)
No sé (aunque supongo que sí), si en pseint se puede convertir un caracter a número, que es la idea.

Eleкtro

#2
Cita de: shadowzgz en 23 Diciembre 2014, 19:43 PMMi problema básicamente es como convertir una A en una D, una B en una E, y así sucesivamente. ¿Necesito crear una tabla con cada una de las letras del abecedario? Tengo un lio....  :huh: ¿Cómo lo harías vosotros?

El cifrado Caesar se basa en establecer un valor de desplazamiento (Shift), y desplazar cada letra del String a cifrar utilizando ese valor de desplazamiento.

¿Como se pasa una A a una D?, pues estableciendo un desplazamiento de +3: A -> B -> C --> D

Para revertir los cambios y dejar el string cifrado en su estado original, simplemente se utiliza el valor de desplazamiento a la inversa (negativo/positivo). en este caso -3: D -> C -> B -> A

EDITO:
Debes fijar un set de caracteres a utilizar, de la A a la Z (plus 0-9, o lo que quieras), y si el valor de desplazamiento es superior a la cantidad de caracteres, vuelves a empezar para contar desde la primera letra.

Saludos








shadowzgz

#3
Buenas,
Primero de todo, gracias por contestar xD
Me ha surgido una nueva duda. ¿Cómo hago para que que el programa me detecte cada una de las letras que el usuario escribe para poder cifrarlas? Me suena al ejercicio el cual hay que dar la vuelta a un número, y hay que hacerlo mediante los restos porque pseint no detecta cada uno de los números que componen, por ejemplo, 9635463. Pero claro, esto es con números, no con letras :huh:

Proceso cifrado_cesar
//Rellenar una cadena texto, con un mínimo de 10 palabras, y mostrar el texto cifrado con el método Cesar o cifrado por desplazamiento.5
definir frase, tabla como caracter;


Dimension tabla[26];
//cremos un vector e introducimos el abcdario. Omito la "ñ", ya que da errores.
tabla[0]="a";
tabla[1]="b";
tabla[2]="c";
tabla[3]="d";
tabla[4]="e";
tabla[5]="f";
tabla[6]="g";
tabla[7]="h";
tabla[8]="i";
tabla[9]="j";
tabla[10]="k";
tabla[11]="l";
tabla[12]="m";
tabla[13]="n";
tabla[14]="o";
tabla[15]="p";
tabla[16]="q";
tabla[17]="r";
tabla[18]="s";
tabla[19]="t";
tabla[20]="u";
tabla[21]="v";
tabla[22]="w";
tabla[23]="x";
tabla[24]="y";
tabla[25]="z";

//Preguntamos al usuario para que escriba una frase.
Escribir "Escribe una frase con un mínimo de 10 palabras";
Leer frase;
//pasamos la frase a minúsculas para no tener que preguntar 2 veces por cada vocal
frase=Minusculas(frase);
escribir frase;

FinProceso


Eleкtro

#4
Cita de: shadowzgz en 24 Diciembre 2014, 00:31 AM¿Cómo hago para que que el programa me detecte cada una de las letras que el usuario escribe para poder cifrarlas?

Pseudo-código:

Sub Main()

DecryptedStr = "Hello world"
EncryptedStr = EncryptString(DecryptedStr, 3)
Print EncryptedStr
Terminate

End Sub

Function EncryptString(Str As String, Shift As Integer) Returns String

CharSet[]    = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789".Split()
EncryptedStr = ""

For Each C as Character in Str Do

If CharSet.Contains(C) Then

CharIndex = CharSet.FindIndex(C)

If Not (CharIndex + Shift) > (CharSet.Length) Then
char = CharSet(CharIndex + Shift)
Else
char = CharSet((CharIndex + Shift) - (CharSet.Length - Shift))
End If
     
EncryptedStr = EncryptedStr.Concatenate(char)

Else
 ThrowError("Unknown character to encrypt.")

End If // CharSet.Contains()

End For // Each C as Character in Str

Return EncryptedStr

End Function