|
@@ -4,9 +4,9 @@
|
4
|
4
|
![main2.png](images/main2.png)
|
5
|
5
|
![main3.png](images/main3.png)
|
6
|
6
|
|
7
|
|
-[Verano 2016 - Ive]
|
|
7
|
+[Verano 2016 - Ive - Tatiana]
|
8
|
8
|
|
9
|
|
-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 completarás una aplicación de esteganografía para practicar el uso de ciclos anidados en la manipulación de arreglos bi-dimensionales.
|
|
9
|
+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, completarás una aplicación de esteganografía para practicar el uso de ciclos anidados en la manipulación de arreglos bi-dimensionales.
|
10
|
10
|
|
11
|
11
|
|
12
|
12
|
## Objetivos:
|
|
@@ -22,10 +22,9 @@ Una de las ventajas de utilizar programas de computadoras es que podemos realiza
|
22
|
22
|
|
23
|
23
|
Antes de llegar al laboratorio debes haber:
|
24
|
24
|
|
25
|
|
-
|
26
|
25
|
1. Repasado los conceptos básicos relacionados a estructuras de repetición, arreglos bi-dimensionales y estructuras de control.
|
27
|
26
|
|
28
|
|
-2. Estudiado los conceptos de componentes de color de los pixeles de imágenes.
|
|
27
|
+2. Estudiado los conceptos de componentes de color de los píxeles de imágenes.
|
29
|
28
|
|
30
|
29
|
3. Estudiado la representación binaria de caracteres.
|
31
|
30
|
|
|
@@ -33,7 +32,7 @@ Antes de llegar al laboratorio debes haber:
|
33
|
32
|
|
34
|
33
|
5. Estudiado los conceptos e instrucciones de la sesión de laboratorio.
|
35
|
34
|
|
36
|
|
-6. Tomado el quiz Pre-Lab que se encuentra en Moodle.
|
|
35
|
+6. Tomado el quiz Pre-Lab, disponible en Moodle.
|
37
|
36
|
|
38
|
37
|
---
|
39
|
38
|
|
|
@@ -43,14 +42,14 @@ Antes de llegar al laboratorio debes haber:
|
43
|
42
|
|
44
|
43
|
## Esteganografía
|
45
|
44
|
|
46
|
|
-La esteganografía es la ciencia de camuflar la presencia de mensajes ocultos en portadores legítimos (archivos que parecen inofensivos). Esta ciencia ha sido utilizada por delincuentes cibernéticos para ocasionar daños a sistemas de computadoras, y por terroristas para codificar mensajes ocultos en transmisiones de internet. Se dice que Al-Qaeda puede haber utilizado esteganografía para codificar mensajes en imágenes y luego transportarlos por correo electrónico, y posiblemente por USENET, para preparar y ejecutar los ataques terroristas del 11 de septiembre de 2001.
|
|
45
|
+La esteganografía es la ciencia de camuflar la presencia de mensajes ocultos en portadores legítimos (archivos que parecen inofensivos). Esta ciencia ha sido utilizada por delincuentes cibernéticos para ocasionar daños a sistemas de computadoras, y por terroristas para codificar mensajes ocultos en transmisiones de internet. Se dice que Al-Qaeda puede haber utilizado la esteganografía para codificar mensajes en imágenes y luego transportarlos por correo electrónico, posiblemente por USENET, para preparar y ejecutar los ataques terroristas del 11 de septiembre de 2001.
|
47
|
46
|
|
48
|
47
|
La esteganografía también tiene algunos usos legales [1]:
|
49
|
48
|
|
50
|
49
|
* Un laboratorio de imágenes médicas puede empotrar información del paciente en las imágenes y así prevenir fraude y/o errores en los diagnósticos del paciente.
|
51
|
|
-* Podemos usar información oculta para identificar los dueños legítimos de un documento o imagen. Si el documento se filtra o se distribuye sin autorización, se puede trazar su origen hasta el dueño legítimo y quizás descubrir quién rompió el acuerdo de distribución.
|
|
50
|
+* Podemos usar información oculta para identificar los dueños legítimos de un documento o una imagen. Si el documento se filtra o se distribuye sin autorización, se puede trazar su origen hasta el dueño legítimo y quizás descubrir quién rompió el acuerdo de distribución.
|
52
|
51
|
|
53
|
|
-En esta experiencia de laboratorio implementarás un algoritmo simple para extraer mensajes ocultos en imágenes usando técnicas de esteganografía.
|
|
52
|
+En esta experiencia de laboratorio, implementarás un algoritmo simple para extraer mensajes ocultos en imágenes usando técnicas de esteganografía.
|
54
|
53
|
|
55
|
54
|
---
|
56
|
55
|
|
|
@@ -61,7 +60,7 @@ En esta experiencia de laboratorio, recuperarás un mensaje secreto que ha sido
|
61
|
60
|
|
62
|
61
|
### Píxeles
|
63
|
62
|
|
64
|
|
-Al elemento más pequeño de una imagen se le llama un *píxel*. Esta unidad consiste de un solo color. Como cada color es una combinación de tonalidades de los colores primarios rojo, verde y azul, se codifica como un entero sin signo cuyos bytes representan los tonos de rojo, verde y azul del pixel (Figura 1). A esta combinación se le llama el *RGB* del color por las siglas de "Red-Green-Blue". Por ejemplo, un píxel de color rojo (puro) tiene una representación RGB `0x00ff0000`, mientras que un píxel de color blanco tiene una representación RGB de `0x00FFFFFF` (ya que el color blanco es la combinación de los tonos rojo, verde y azul en toda su intensidad).
|
|
63
|
+Al elemento más pequeño de una imagen se le llama *píxel*. Esta unidad consiste de un solo color. Como cada color es una combinación de tonalidades de los colores primarios rojo, verde y azul, se codifica como un entero sin signo cuyos bytes representan los tonos de rojo, verde y azul del píxel (Figura 1). A esta combinación se le llama el *RGB* del color por las siglas de "Red-Green-Blue". Por ejemplo, un píxel de color rojo (puro) tiene una representación RGB `0x00ff0000`, mientras que un píxel de color blanco tiene una representación RGB de `0x00FFFFFF` (ya que el color blanco es la combinación de los tonos rojo, verde y azul en toda su intensidad).
|
65
|
64
|
|
66
|
65
|
---
|
67
|
66
|
|
|
@@ -75,7 +74,7 @@ En `Qt` se utiliza el tipo `QRgb` para representar valores `RGB`. Utilizando la
|
75
|
74
|
|
76
|
75
|
### Biblioteca
|
77
|
76
|
|
78
|
|
-La experiencia de laboratorio de hoy utilizará la clase `QImage`. Esta clase permite acceder a los datos de los pixeles de una imagen para poder manipularla. La documentación de la clase `QImage` se encuentra en http://doc.qt.io/qt-4.8/qimage.html.
|
|
77
|
+La experiencia de laboratorio de hoy utilizará la clase `QImage`. Esta clase permite acceder a los datos de los píxeles de una imagen para poder manipularla. La documentación de la clase `QImage` se encuentra en http://doc.qt.io/qt-4.8/qimage.html.
|
79
|
78
|
|
80
|
79
|
El código que te proveemos en el archivo `steganography.cpp` contiene los siguiente objetos de la clase `QImage`:
|
81
|
80
|
|
|
@@ -109,7 +108,7 @@ Las siguientes funciones te serán útiles para trabajar con datos de tipo `QRgb
|
109
|
108
|
`int greenContent = qGreen(origImage.pixel(1,1));`.
|
110
|
109
|
|
111
|
110
|
|
112
|
|
-3. El siguiente programa crea un objeto de clase `QImage` e imprime los componentes rojo, verde y azul del pixel en el centro de la imagen. La imagen utilizada es la que se especifica dentro del paréntesis durante la creación del objeto, esto es, el archivo `chuck.png`.
|
|
111
|
+3. El siguiente programa crea un objeto de clase `QImage` e imprime los componentes rojo, verde y azul del píxel en el centro de la imagen. La imagen utilizada es la que se especifica dentro del paréntesis durante la creación del objeto, esto es, el archivo `chuck.png`.
|
113
|
112
|
|
114
|
113
|
#include <QImage>
|
115
|
114
|
#include <iostream>
|
|
@@ -123,7 +122,7 @@ Las siguientes funciones te serán útiles para trabajar con datos de tipo `QRgb
|
123
|
122
|
|
124
|
123
|
cout << hex;
|
125
|
124
|
|
126
|
|
- cout << “Los componentes rojo, verde y azul del pixel central son: “
|
|
125
|
+ cout << “Los componentes rojo, verde y azul del píxel central son: “
|
127
|
126
|
<< qRed(centralPixel) << “, “
|
128
|
127
|
<< qGreen(centralPixel) << “, “
|
129
|
128
|
<< qBlue(centralPixel) << endl;
|
|
@@ -135,7 +134,7 @@ Las siguientes funciones te serán útiles para trabajar con datos de tipo `QRgb
|
135
|
134
|
|
136
|
135
|
Uno de los métodos más simples para esconder un mensaje en una imagen es codificando el mensaje en los bits menos significativos de los componentes de los colores de los píxeles de la imagen. Este método esconde el mensaje en la imagen eficientemente porque el efecto al cambiar el bit menos significativo en un color de 8 bits es casi imperceptible para el ojo humano.
|
137
|
136
|
|
138
|
|
-Por ejemplo, la Figura 2 muestra dos píxeles gigantes, el de la izquierda es de color `0xff0000`y el de la derecha es de color `0xfe0101`. Recuerda que el **byte** más significativo (esto es, los dos dígitos hexadecimales más a la izquierda) representan la intensidad del color rojo, el segundo **byte** representa la intensidad del color verde, y el **byte** menos significativo representa la intensidad del color azul. En la Figura 2, los **bits** menos significativos de los componentes rojo, verde y azul de los dos píxeles son diferentes, sin embargo, ambos píxeles se ven del mismo color. El píxel de la derecha es el resultado de codificar el mensaje de tres bits `011` en los bits menos significativos de cada color en el píxel original. Esto es, codificar el `0` en el bit menos significativo del componente rojo, codificar el `1` en el bit menos significativo del componente verde, y codificar el `1` en el bit menos significativo del componente azul del píxel.
|
|
137
|
+Por ejemplo, la Figura 2 muestra dos píxeles gigantes, el de la izquierda es de color `0xff0000` y el de la derecha es de color `0xfe0101`. Recuerda que el **byte** más significativo (esto es, los dos dígitos hexadecimales más a la izquierda) representan la intensidad del color rojo, el segundo **byte** representa la intensidad del color verde, y el **byte** menos significativo representa la intensidad del color azul. En la Figura 2, los **bits** menos significativos de los componentes rojo, verde y azul de los dos píxeles son diferentes, sin embargo, ambos píxeles se ven del mismo color. El píxel de la derecha es el resultado de codificar el mensaje de tres bits `011` en los bits menos significativos de cada color en el píxel original. Esto es, codificar el `0` en el bit menos significativo del componente rojo, codificar el `1` en el bit menos significativo del componente verde, y codificar el `1` en el bit menos significativo del componente azul del píxel.
|
139
|
138
|
|
140
|
139
|
---
|
141
|
140
|
|
|
@@ -245,12 +244,11 @@ Explica tu respuesta.
|
245
|
244
|
|
246
|
245
|
## Sesión de laboratorio:
|
247
|
246
|
|
248
|
|
-En la experiencia de laboratorio de hoy completarás una aplicación de esteganografía para extraer mensajes ocultos en imágenes.
|
|
247
|
+En la experiencia de laboratorio de hoy, completarás una aplicación de esteganografía para extraer mensajes ocultos en imágenes.
|
249
|
248
|
|
250
|
249
|
### Ejercicio 1 - Extraer el mensaje binario
|
251
|
250
|
|
252
|
|
-#### Instrucciones:
|
253
|
|
-
|
|
251
|
+#### Instrucciones
|
254
|
252
|
|
255
|
253
|
1. Carga a `QtCreator` el proyecto `Steganography`. Hay dos maneras de hacer esto:
|
256
|
254
|
|
|
@@ -259,7 +257,7 @@ En la experiencia de laboratorio de hoy completarás una aplicación de estegano
|
259
|
257
|
|
260
|
258
|
El proyecto contiene el esqueleto de una aplicación para recuperar mensajes empotrados en imágenes. Los mensajes que estarás recobrando se empotraron utilizando la técnica del bit menos significativo. El final de cada mensaje se codificó utilizando el caracter ASCII con código binario `00000000`.
|
261
|
259
|
|
262
|
|
-2. Compila y corre el programa. Debes obtener una interface que luce parecida a:
|
|
260
|
+2. Compila y corre el programa. Debes obtener una interfaz que luce parecida a:
|
263
|
261
|
|
264
|
262
|
![img1.png](images/img1.png)
|
265
|
263
|
|
|
@@ -277,7 +275,7 @@ En la experiencia de laboratorio de hoy completarás una aplicación de estegano
|
277
|
275
|
Nota que tu algoritmo debe tener algún mecanismo para detectar si el último bloque de 8 caracteres extraídos eran todos `0`. Cuando esto pase, el algoritmo debe parar de leer los píxeles.
|
278
|
276
|
|
279
|
277
|
|
280
|
|
- El "string" de dígitos binarios debe ser enviado a otra función `binaryStringToMessage` (ver Ejercicio 2) que interprete los `0`'s y `1`'s como los bits de caracteres ASCII. En el ejemplo, si pasaras el argumento `”010001000110111101100111000000000”` a la función `binaryStringToMessage`, debería devolver "Dog" (porque `01000100` corresponde a `D`, `01101111` es 'o', `01100111` es 'g', y un `00000000` simboliza que se terminó el “string”.)
|
|
278
|
+ El "string" de dígitos binarios debe ser enviado a otra función `binaryStringToMessage` (ver Ejercicio 2) que interprete los `0`'s y `1`'s como los bits de caracteres ASCII. En el ejemplo de arriba, si pasaras el argumento `”010001000110111101100111000000000”` a la función `binaryStringToMessage`, debería devolver "Dog" (porque `01000100` corresponde a `D`, `01101111` es 'o', `01100111` es 'g', y un `00000000` simboliza que se terminó el “string”.)
|
281
|
279
|
|
282
|
280
|
|
283
|
281
|
Para poder implementar el algoritmo de extracción del mensaje, debes entender cómo fue empotrado el mensaje. Si es necesario, repasa la sección “Empotrando un mensaje en una imagen”.
|
|
@@ -285,10 +283,10 @@ En la experiencia de laboratorio de hoy completarás una aplicación de estegano
|
285
|
283
|
|
286
|
284
|
### Ejercicio 2 - Interpretar el mensaje
|
287
|
285
|
|
288
|
|
-#### Instrucciones:
|
|
286
|
+#### Instrucciones
|
289
|
287
|
|
290
|
288
|
|
291
|
|
-1. Completa la función `binaryStringToMessage` que recibe el "string" de `0`'s y `1`'s extraido de la imagen para que devuelva el mensaje oculto. Puedes aprovechar la función `binStringToChar` para convertir "substrings" de 8 `0`'s y `1`'s en el caracter que le corresponde.
|
|
289
|
+1. Completa la función `binaryStringToMessage` que recibe el "string" de `0`'s y `1`'s extraidos de la imagen para que devuelva el mensaje oculto. Puedes aprovechar la función `binStringToChar` para convertir "substrings" de 8 `0`'s y `1`'s en el caracter que le corresponde.
|
292
|
290
|
|
293
|
291
|
2. Prueba tu código usando las siguientes imágenes
|
294
|
292
|
|
|
@@ -308,7 +306,7 @@ En la experiencia de laboratorio de hoy completarás una aplicación de estegano
|
308
|
306
|
|
309
|
307
|
##Entrega
|
310
|
308
|
|
311
|
|
-Utiliza "Entrega" en Moodle para entregar el archivo `steganography.cpp` que contiene las funciones `ExtractMessage` y `binaryStringToMessage`. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
|
|
309
|
+Utiliza "Entrega" en Moodle para entregar el archivo `steganography.cpp` que contiene las funciones `ExtractMessage` y `binaryStringToMessage`. Recuerda utilizar buenas prácticas de programación, incluye el nombre de los programadores y documenta tu programa.
|
312
|
310
|
|
313
|
311
|
|
314
|
312
|
---
|
|
@@ -325,3 +323,5 @@ Utiliza "Entrega" en Moodle para entregar el archivo `steganography.cpp` que con
|
325
|
323
|
---
|
326
|
324
|
|
327
|
325
|
---
|
|
326
|
+
|
|
327
|
+
|