|
@@ -5,9 +5,9 @@
|
5
|
5
|
![main2.png](images/main2.png)
|
6
|
6
|
![main3.png](images/main3.png)
|
7
|
7
|
|
8
|
|
-[Verano 2016 - Ive]
|
|
8
|
+[Verano 2016 - Ive- Tatiana]
|
9
|
9
|
|
10
|
|
-Una de las ventajas de utilizar programas de computadoras es que podemos realizar tareas repetitivas fácilmente. Los ciclos como `for`, `while`, y `do-while` son estructuras de control que nos permiten repetir un conjunto de instrucciones. A estas estructuras también se les llama *estructuras de repetición*. En la experiencia de laboratorio de hoy utilizarás ciclos `for` para completar una aplicación de cifrado.
|
|
10
|
+Una de las ventajas de utilizar programas de computadoras es que podemos realizar tareas repetitivas fácilmente. Los ciclos como `for`, `while`, y `do-while` son estructuras de control que nos permiten repetir un conjunto de instrucciones. A estas estructuras también se les llama *estructuras de repetición*. En la experiencia de laboratorio de hoy utilizarás ciclos `for` para completar una aplicación de cifrado.
|
11
|
11
|
|
12
|
12
|
## Objetivos:
|
13
|
13
|
|
|
@@ -20,7 +20,7 @@ Antes de llegar al laboratorio debes haber:
|
20
|
20
|
|
21
|
21
|
1. Repasado los conceptos básicos relacionados a estructuras de repetición.
|
22
|
22
|
|
23
|
|
-2. Repasado conceptos básicos de la clase `string` de C++,las funciones `length`, `toupper` y `push_back`, `isalpha` y las operaciones aritméticas con caracteres.
|
|
23
|
+2. Repasado conceptos básicos de la clase `string` de C++, las funciones `length`, `toupper` y `push_back`, `isalpha` y las operaciones aritméticas con caracteres.
|
24
|
24
|
|
25
|
25
|
3. Visto el video sobre el "Ceasar Cypher" del Khan Academy, colocado en <https://www.youtube.com/watch?v=sMOZf4GN3oc>.
|
26
|
26
|
|
|
@@ -28,7 +28,7 @@ Antes de llegar al laboratorio debes haber:
|
28
|
28
|
|
29
|
29
|
5. Estudiado los conceptos e instrucciones para la sesión de laboratorio.
|
30
|
30
|
|
31
|
|
-6. Tomado el quiz Pre-Lab disponible en Moodle.
|
|
31
|
+6. Tomado el quiz Pre-Lab, disponible en Moodle.
|
32
|
32
|
|
33
|
33
|
|
34
|
34
|
---
|
|
@@ -37,7 +37,7 @@ Antes de llegar al laboratorio debes haber:
|
37
|
37
|
|
38
|
38
|
## Criptografía
|
39
|
39
|
|
40
|
|
-La *criptografía* es un área que estudia la teoría y los métodos utilizados para proteger información de modo que personas que no estén autorizadas no puedan tener acceso a ella. Un *sistema criptográfico* es un sistema en el que la información (*mensaje* entendible por humanos) es tranformada a un texto cifrado inentendible para las personas no autorizadas a verlo. Las personas autorizadas a ver el mensaje usan un *descifrador* para revertir el texto cifrado al mensaje original.
|
|
40
|
+La *criptografía* es un área que estudia la teoría y los métodos utilizados para proteger información de modo que personas que no estén autorizadas no puedan tener acceso a ella. Un *sistema criptográfico* es un sistema en el que la información (*mensaje* entendible por humanos) es transformada a un texto cifrado inentendible para las personas no autorizadas a verlo. Las personas autorizadas a ver el mensaje usan un *descifrador* para revertir el texto cifrado al mensaje original.
|
41
|
41
|
|
42
|
42
|
### El Cifrado César (Ceasar Cypher)
|
43
|
43
|
|
|
@@ -47,7 +47,7 @@ El Cifrado César es una técnica muy simple de cifrado por sustitución. Se dic
|
47
|
47
|
|
48
|
48
|
![figure1.png](images/figure1.png)
|
49
|
49
|
|
50
|
|
-**Figura 1.** Cifrador César con desplazamiento de 3 espacios.
|
|
50
|
+**Figura 1.** Cifrado César con desplazamiento de 3 espacios.
|
51
|
51
|
|
52
|
52
|
---
|
53
|
53
|
|
|
@@ -57,13 +57,13 @@ El Cifrado César es una técnica muy simple de cifrado por sustitución. Se dic
|
57
|
57
|
|
58
|
58
|
![figure2.png](images/figure2.png)
|
59
|
59
|
|
60
|
|
-**Figura 2.** Disco para cifrador César que muestra un desplazamiento de 8 espacios.
|
|
60
|
+**Figura 2.** Disco para cifrado César que muestra un desplazamiento de 8 espacios.
|
61
|
61
|
|
62
|
62
|
---
|
63
|
63
|
|
64
|
64
|
### Utilizando el operador módulo
|
65
|
65
|
|
66
|
|
-La operación de suma modular es esencial para implementar sistemas de cifrado en programación. En la aplicación de cifrado César de arriba podemos pensar que a cada letra del alfabeto (en inglés) le asignamos un número entre 0 y 25 (La `A` es 0, la`B` es 1, …, la `Z` es 25). El cifrador César convierte cada letra al número correspondiente en el intervalo [0, 25] y luego suma el desplazamiento. Para hacer el desplazamiento cíclico, cada vez que nuestro desplazamiento nos dé una letra que corresponda a un número mayor que 25, tomamos el residuo al dividir por 26 y usamos la letra que corresponda a ese residuo. Nota que tomar el residuo al dividir por 26 los resultados estarán entre 0 y 25, que son los valores asociados al alfabeto.
|
|
66
|
+La operación de suma modular es esencial para implementar sistemas de cifrado en programación. En la aplicación de cifrado César de arriba podemos pensar que a cada letra del alfabeto (en inglés) le asignamos un número entre 0 y 25 (La `A` es 0, la`B` es 1, …, la `Z` es 25). El cifrado César convierte cada letra al número correspondiente en el intervalo [0, 25] y luego suma el desplazamiento. Para hacer el desplazamiento cíclico, cada vez que nuestro desplazamiento nos dé una letra que corresponda a un número mayor que 25, tomamos el residuo al dividir por 26 y usamos la letra que corresponda a ese residuo. Nota que tomar el residuo al dividir por 26 los resultados estarán entre 0 y 25, que son los valores asociados al alfabeto.
|
67
|
67
|
|
68
|
68
|
El residuo al dividir dos números enteros se puede obtener utilizando el operador de *módulo*: `%`.
|
69
|
69
|
|
|
@@ -71,12 +71,12 @@ Volviendo al Ejemplo 1, en la palabra "ARROZ", a la letra ‘Z’ le corresponde
|
71
|
71
|
|
72
|
72
|
El proceso de arriba funciona si podemos asociar las letras de la ‘A’ a la ‘Z’ con los números del `0` al `25`. Esto se logra utilizando el valor numérico de los caracteres. Como en el código ASCII el valor de las letras ‘A’ a la ‘Z’ va desde 65 hasta 90, necesitamos hacer un ajuste en el cómputo de modo que a la `A` se le asigne `0`. Para convertir una letra mayúscula a un número en el intervalo [0, 25] solo tenemos que restar 65 (`’A’ - 65 = 0`, `’Z’ - 65 = 25`). Para cambiar un valor en el intervalo [0, 25] a la letra mayúscula que corresponde en el código ASCII solo tenemos que sumar 65 al número. Por ejemplo, el número 3 corresponde a la letra cuyo código ASCII es $3 + 65 = 68$, la letra ‘D’.
|
73
|
73
|
|
74
|
|
-La Figura 3 muestra el pseudocódigo para una algoritmo para el cifrador César. Cada letra ‘c’ en el mensaje se convierte a un número en el intervalo [0, 25] (restándole ‘A’), luego se hace el desplazamiento de d unidades al número (sumando d módulo 26). Finalmente se convierte el resultado al caracter correspondiente sumando el código ASCII de ‘A’.
|
|
74
|
+La Figura 3 muestra el pseudocódigo para una algoritmo para el cifrado César. Cada letra ‘c’ en el mensaje se convierte a un número en el intervalo [0, 25] (restándole ‘A’), luego se hace el desplazamiento de `d` unidades al número (sumando `d` módulo 26). Finalmente se convierte el resultado al carácter correspondiente sumando el código ASCII de ‘A’.
|
75
|
75
|
|
76
|
76
|
---
|
77
|
77
|
|
78
|
78
|
```cpp
|
79
|
|
- Datos de entrada: un "string" de mensaje, la cantidad de desplazamiento d
|
|
79
|
+ Datos de entrada: un "string" de mensaje, la cantidad de desplazamiento `d`
|
80
|
80
|
Datos de salida: el mensaje cifrado usando cifrado César
|
81
|
81
|
|
82
|
82
|
1. cypheredText = ""
|
|
@@ -88,19 +88,19 @@ La Figura 3 muestra el pseudocódigo para una algoritmo para el cifrador César.
|
88
|
88
|
3. devuelve ("return") cypheredText
|
89
|
89
|
```
|
90
|
90
|
|
91
|
|
-**Figura 3.** Pseudo-código para cifrar utilizando un cifrador César.
|
|
91
|
+**Figura 3.** Pseudo-código para cifrar utilizando un cifrado César.
|
92
|
92
|
|
93
|
93
|
---
|
94
|
94
|
|
95
|
|
-El cifrado César no es muy seguro ya que puede descifrarse fácilmente con un análisis de frecuencia. Por ejemplo, se sabe que en el idioma inglés la letra ‘e’ es la letra más frecuente en un texto. Si buscamos la letra que más se repite en un texto cifrado con un cifrador César, lo más probable es que esa fue la letra que se sustituyó por la ‘e’; con esto podemos deducir cuál fue desplazamiento utilizado y así descifrar el mensaje.
|
|
95
|
+El cifrado César no es muy seguro ya que puede descifrarse fácilmente con un análisis de frecuencia. Por ejemplo, se sabe que en el idioma inglés la letra ‘e’ es la letra más frecuente en un texto. Si buscamos la letra que más se repite en un texto cifrado con un cifrado César, lo más probable es que esa fue la letra que se sustituyó por la ‘e’; con esto podemos deducir cuál fue desplazamiento utilizado y así descifrar el mensaje.
|
96
|
96
|
|
97
|
97
|
|
98
|
98
|
|
99
|
99
|
### El Cifrado Vigenere
|
100
|
100
|
|
101
|
|
-La debilidad principal del cifrador César es que cada letra en el mensaje se desplaza por el mismo número de posiciones. El cifrado Vigenere es un método de cifrado un poco más fuerte porque el desplazamiento en cada letra no es constante. El cifrado César recibe como datos de entrada el mensaje y un desplazamiento, mientras que el cifrado Vigenere recibe como dato de entrada el mensaje y una **clave** que determina el desplazamiento que se le hará a cada letra del mensaje.
|
|
101
|
+La debilidad principal del cifrado César es que cada letra en el mensaje se desplaza por el mismo número de posiciones. El cifrado Vigenere es un método de cifrado un poco más fuerte porque el desplazamiento en cada letra no es constante. El cifrado César recibe como datos de entrada el mensaje y un desplazamiento, mientras que el cifrado Vigenere recibe como dato de entrada el mensaje y una **clave** que determina el desplazamiento que se le hará a cada letra del mensaje.
|
102
|
102
|
|
103
|
|
-**Ejemplo 2.** Supongamos por el momento que tanto el mensaje como la clave tienen el mismo largo. Por ejemplo, suponga que el mensaje es "COSAS" y la palabra clave es "MENOR". La letra ‘C’ se parea con la letra ‘M’, la letra ‘O’ se parea con la letra ‘E’, la ‘S’ con la ‘N’, etcétera, como en la figura de abajo. Como la letra ‘A’ corresponde a un desplazamiento de 0 espacios, entonces la letra ‘M’ corresponde a un desplazamiento de 12 espacios, la ‘E’ a un desplazamiento de 4 espacios, etc. Utilizando la palabra clave "MENOR", el cifrador Vigenere hará un desplazamiento de 12 espacios a la letra ‘C’, un desplazamiento de 4 espacios a la letra ‘O’, etc., hasta obtener la palabra cifrada "OSFOJ" como se muestra en la Figura 4.
|
|
103
|
+**Ejemplo 2.** Supongamos por el momento que tanto el mensaje como la clave tienen el mismo largo. Por ejemplo, suponga que el mensaje es "COSAS" y la palabra clave es "MENOR". La letra ‘C’ se parea con la letra ‘M’, la letra ‘O’ se parea con la letra ‘E’, la ‘S’ con la ‘N’, etcétera, como en la figura de abajo. Como la letra ‘A’ corresponde a un desplazamiento de 0 espacios, entonces la letra ‘M’ corresponde a un desplazamiento de 12 espacios, la ‘E’ a un desplazamiento de 4 espacios, etc. Utilizando la palabra clave "MENOR", el cifrado Vigenere hará un desplazamiento de 12 espacios a la letra ‘C’, un desplazamiento de 4 espacios a la letra ‘O’, etc., hasta obtener la palabra cifrada "OSFOJ" como se muestra en la Figura 4.
|
104
|
104
|
|
105
|
105
|
---
|
106
|
106
|
|
|
@@ -113,13 +113,13 @@ La debilidad principal del cifrador César es que cada letra en el mensaje se de
|
113
|
113
|
|
114
|
114
|
---
|
115
|
115
|
|
116
|
|
-Podemos visualizar un cifrador Vigenere utilizando una tabla como la de la Figura 5. Nota que lo que se hace es usar un cifrador César con un desplazamiento diferente para cada letra del mensaje.
|
|
116
|
+Podemos visualizar un cifrado Vigenere utilizando una tabla como la de la Figura 5. Nota que lo que se hace es usar un cifrado César con un desplazamiento diferente para cada letra del mensaje.
|
117
|
117
|
|
118
|
118
|
---
|
119
|
119
|
|
120
|
120
|
![figure6.png](images/figure6.png)
|
121
|
121
|
|
122
|
|
-**Figura 5.** Tabla para cifrador Vigenere.
|
|
122
|
+**Figura 5.** Tabla para el cifrado Vigenere.
|
123
|
123
|
|
124
|
124
|
---
|
125
|
125
|
|
|
@@ -143,13 +143,13 @@ El programa que estarás modificando en la sesión de hoy utiliza los siguientes
|
143
|
143
|
|
144
|
144
|
* `length`: Devuelve el largo de un objeto de la clase `string`; esto es, `length` devuelve el número de caracteres que tiene el "string". Se utiliza escribiendo `.length()` después del nombre del objeto.
|
145
|
145
|
|
146
|
|
-* `push_back`: Este método recibe un caracter como argumento y lo añade al final del “string”. Se utiliza escribiendo `.push_back(elCaracter)` después del nombre del “string”. Por ejemplo, para añadir el caracter 'a' a un objeto de la clase `string` llamado `cadena`, escribimos `cadena.push_back('a')`.
|
|
146
|
+* `push_back`: Este método recibe un carácter como argumento y lo añade al final del “string”. Se utiliza escribiendo `.push_back(elCaracter)` después del nombre del “string”. Por ejemplo, para añadir el carácter 'a' a un objeto de la clase `string` llamado `cadena`, escribimos `cadena.push_back('a')`.
|
147
|
147
|
|
148
|
148
|
También utilizaremos las funciones:
|
149
|
149
|
|
150
|
|
-* `toupper`: Esta función recibe como argumento un caracter y devuelve el caracter en mayúscula. Por ejemplo, para cambiar el caracter 'a' a mayúscula se utiliza `toupper('a')`.
|
|
150
|
+* `toupper`: Esta función recibe como argumento un carácter y devuelve el caracter en mayúscula. Por ejemplo, para cambiar el carácter 'a' a mayúscula se utiliza `toupper('a')`.
|
151
|
151
|
|
152
|
|
-* `isalpha`: Esta función recibe como argumento un caracter y devuelve un valor distinto de cero (`true`) si el caracter es una letra y cero (`false`) si el caracter no es una letra. Por ejemplo, `isalpha(3)` devuelve "false" pero `isalpha(‘F’)` devuelve `true`.
|
|
152
|
+* `isalpha`: Esta función recibe como argumento un carácter y devuelve un valor distinto de cero (`true`) si el carácter es una letra y cero (`false`) si el carácter no es una letra. Por ejemplo, `isalpha(3)` devuelve `false` pero `isalpha(‘F’)` devuelve `true`.
|
153
|
153
|
|
154
|
154
|
|
155
|
155
|
---
|
|
@@ -174,9 +174,9 @@ También utilizaremos las funciones:
|
174
|
174
|
|
175
|
175
|
## Sesión de laboratorio:
|
176
|
176
|
|
177
|
|
-En esta experiencia de laboratorio completarás una aplicación para cifrar un mensaje de texto utilizando el cifrado Vigenere. Para simplificar el código, la clave y el mensaje deben consistir solo de letras y tu programa debe cambiar todas las letras del mensaje y la clave a mayúsculas.
|
|
177
|
+En esta experiencia de laboratorio, completarás una aplicación para cifrar un mensaje de texto utilizando el cifrado Vigenere. Para simplificar el código, la clave y el mensaje deben consistir sólo de letras y tu programa debe cambiar todas las letras del mensaje y la clave a mayúsculas.
|
178
|
178
|
|
179
|
|
-### Ejercicio 1 - Cifrador con clave y mensaje del mismo largo (solo letras)
|
|
179
|
+### Ejercicio 1 - Cifrado con clave y mensaje del mismo largo (solo letras)
|
180
|
180
|
|
181
|
181
|
En este ejercicio completarás la aplicación para cifrar un mensaje de texto,
|
182
|
182
|
que solo contiene letras, utilizando una palabra clave que también consiste solo de letras y que tiene el mismo largo del mensaje.
|
|
@@ -188,22 +188,22 @@ que solo contiene letras, utilizando una palabra clave que también consiste sol
|
188
|
188
|
* Utilizando la máquina virtual: Haz doble “click” en el archivo `VigenereCypher.pro` que se encuentra en el directorio `/home/eip/labs/repetitions-vigenerecypher` de la máquina virtual.
|
189
|
189
|
* Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/repetitions-vigenerecypher` para descargar la carpeta `repetitions-vigenerecypher` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `VigenereCypher.pro`.
|
190
|
190
|
|
191
|
|
-2. Estarás añadiendo código en el archivo `cypher.cpp`. En este archivo, la función `cypher` recibe un mensaje y una clave del mismo largo y consistentes solo de letras, y devuelve el mensaje cifrado por el cifrador Vigenere. Tu tarea es completar la función de cifrado.
|
|
191
|
+2. Estarás añadiendo código en el archivo `cypher.cpp`. En este archivo, la función `cypher` recibe un mensaje y una clave del mismo largo y consistentes sólo de letras, y devuelve el mensaje cifrado por el cifrado Vigenere. Tu tarea es completar la función de cifrado.
|
192
|
192
|
|
193
|
|
- El código debe verificar si el mensaje y la clave consisten solo de letras y tienen el mismo largo; si esto no ocurre, el mensaje cifrado será (literalmente) `"MENSAJE O CLAVE INVALIDO"`. El programa debe implementar el cifrador Vigenere para ir cifrando cada letra del mensaje utilizando la clave. Solo debes utilizar las funciones mencionadas en la sección anterior. Para simplificar el código tu programa debe cambiar todas las letras del mensaje y la clave a mayúsculas.
|
|
193
|
+ El código debe verificar si el mensaje y la clave consisten solo de letras y tienen el mismo largo; si esto no ocurre, el mensaje cifrado será (literalmente) `"MENSAJE O CLAVE INVÁLIDA"`. El programa debe implementar el cifrado Vigenere para ir cifrando cada letra del mensaje utilizando la clave. Solo debes utilizar las funciones mencionadas en la sección anterior. Para simplificar el código tu programa debe cambiar todas las letras del mensaje y la clave a mayúsculas.
|
194
|
194
|
|
195
|
|
-3. Al terminar tu código, ve a la función `main` y descomenta la invocación a la función de prueba unitaria `test_cypher1`. Esa función realiza varias invocaciones a la función `cypher` para validar si sus resultados son correctos. Tu función `cypher` debe pasar todas las pruebas antes de continuar con la próxima parte de este laboratorio.
|
|
195
|
+3. Al terminar tu código, ve a la función `main` y descomenta la invocación a la función de prueba unitaria `test_cypher1`. Esta función realiza varias invocaciones a la función `cypher` para validar si sus resultados son correctos. Tu función `cypher` debe pasar todas las pruebas antes de continuar con la próxima parte de este laboratorio.
|
196
|
196
|
|
197
|
197
|
|
198
|
|
-### Ejercicio 2 - Cifrador con clave y mensaje de largos arbitrarios
|
|
198
|
+### Ejercicio 2 - Cifrado con clave y mensaje de largos arbitrarios
|
199
|
199
|
|
200
|
|
-En este ejercicio modificarás el código de la función `cypher` que creaste para el Ejercicio 1 de modo que la aplicación ahora pueda cifrar cualquier mensaje utilizando una palabra clave que consista solo de letras pero que tenga cualquier largo.
|
|
200
|
+En este ejercicio modificarás el código de la función `cypher` que creaste para el Ejercicio 1 de modo que la aplicación ahora puede cifrar cualquier mensaje utilizando una palabra clave que consista sólo de letras pero que tenga cualquier largo.
|
201
|
201
|
|
202
|
202
|
#### Instrucciones:
|
203
|
203
|
|
204
|
|
-1. Escribe el código de la función `cypher` para que reciba un mensaje y una clave y devuelva el mensaje cifrado por el cifrador Vigenere. En esta ocasión, el mensaje y la clave pueden tener cualquier largo y el mensaje puede tener cualquier caracter (la clave solo puede tener letras).
|
|
204
|
+1. Escribe el código de la función `cypher` para que reciba un mensaje y una clave y devuelva el mensaje cifrado por el cifrado Vigenere. En esta ocasión, el mensaje y la clave pueden tener cualquier largo y el mensaje puede tener cualquier carácter (la clave solo puede tener letras).
|
205
|
205
|
|
206
|
|
- El programa debe implementar el cifrador Vigenere para ir cifrando cada caracter del mensaje utilizando las letras de la clave. Para simplificar el código, tu programa debe cambiar todas las letras a mayúsculas. Si alguno de los caracteres del mensaje no es una letra, el cifrador no lo cambia, como se muestra en la Figura 7. Si alguno de los caracteres de la clave no es una letra, el mensaje cifrado será "CLAVE INVALIDA". Solo debes utilizar las funciones mencionadas en la sección anterior.
|
|
206
|
+ El programa debe implementar el cifrado Vigenere para ir cifrando cada carácter del mensaje utilizando las letras de la clave. Para simplificar el código, tu programa debe cambiar todas las letras a mayúsculas. Si alguno de los caracteres del mensaje no es una letra, el cifrador no lo cambia, como se muestra en la Figura 7. Si alguno de los caracteres de la clave no es una letra, el mensaje cifrado será "CLAVE INVALIDA". Solo debes utilizar las funciones mencionadas en la sección anterior.
|
207
|
207
|
|
208
|
208
|
---
|
209
|
209
|
|
|
@@ -225,7 +225,7 @@ En este ejercicio modificarás el código de la función `cypher` que creaste pa
|
225
|
225
|
|
226
|
226
|
##Entrega
|
227
|
227
|
|
228
|
|
-Utiliza "Entrega" en Moodle para entregar el archivo `cypher.cpp` que contiene la función `cypher` que creaste en el Ejercicio 2. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
|
|
228
|
+Utiliza "Entrega" en Moodle para entregar el archivo `cypher.cpp` que contiene la función `cypher` que creaste en el Ejercicio 2. Recuerda utilizar buenas prácticas de programación, incluye el nombre de los programadores y documenta tu programa.
|
229
|
229
|
|
230
|
230
|
---
|
231
|
231
|
|
|
@@ -241,3 +241,6 @@ http://www.nctm.org/uploadedImages/Classroom_Resources/Lesson_Plans/
|
241
|
241
|
|
242
|
242
|
-----
|
243
|
243
|
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|