Actualización del código Error ELA
Browse files
app.py
CHANGED
@@ -6,8 +6,6 @@ from PIL import Image
|
|
6 |
from PIL.ExifTags import TAGS, GPSTAGS
|
7 |
import hashlib
|
8 |
import gradio as gr
|
9 |
-
import matplotlib.pyplot as plt
|
10 |
-
import tempfile
|
11 |
import os
|
12 |
from datetime import datetime
|
13 |
|
@@ -69,22 +67,16 @@ def calcular_hash(imagen):
|
|
69 |
imagen_bytes = imagen.tobytes()
|
70 |
return hashlib.md5(imagen_bytes).hexdigest()
|
71 |
|
72 |
-
def analizar_manipulacion(imagen, metadatos):
|
73 |
"""
|
74 |
Analiza si la imagen ha sido manipulada.
|
75 |
"""
|
76 |
manipulada = False
|
77 |
razones = []
|
78 |
|
79 |
-
# Verificar si
|
80 |
-
if imagen.mode == "P":
|
81 |
-
razones.append("La imagen tiene marcas de agua o es una imagen indexada.")
|
82 |
-
manipulada = True
|
83 |
-
|
84 |
-
# Verificar si los metadatos han sido alterados
|
85 |
if not metadatos:
|
86 |
-
razones.append("La imagen no tiene metadatos EXIF.")
|
87 |
-
manipulada = True
|
88 |
else:
|
89 |
if "Software" in metadatos:
|
90 |
razones.append(f"La imagen fue editada con: {metadatos['Software']}")
|
@@ -94,7 +86,12 @@ def analizar_manipulacion(imagen, metadatos):
|
|
94 |
hash_conocido = "1a79a4d60de6718e8e5b326e338ae533" # Hash de ejemplo
|
95 |
hash_actual = calcular_hash(imagen)
|
96 |
if hash_actual != hash_conocido:
|
97 |
-
razones.append("El hash de la imagen no coincide con
|
|
|
|
|
|
|
|
|
|
|
98 |
manipulada = True
|
99 |
|
100 |
return manipulada, razones
|
@@ -156,49 +153,14 @@ def procesar_imagen(archivo_imagen):
|
|
156 |
Fecha de modificación: {fecha_modificacion}
|
157 |
"""
|
158 |
|
159 |
-
# Obtener los primeros 10 bytes del archivo en formato hexadecimal
|
160 |
-
with open(archivo_imagen, "rb") as f:
|
161 |
-
primeros_10_bytes = f.read(10)
|
162 |
-
header_hex = " ".join(f"{byte:02x}" for byte in primeros_10_bytes)
|
163 |
-
|
164 |
-
info_basica += f"""
|
165 |
-
Primeros 10 bytes del archivo (hex): {header_hex}
|
166 |
-
"""
|
167 |
-
|
168 |
# Obtener metadatos
|
169 |
metadatos = obtener_metadatos(imagen)
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
if tag == "DateTime":
|
174 |
-
info_metadatos += f"Fecha y hora de la captura: {value}\n"
|
175 |
-
elif tag == "Make":
|
176 |
-
info_metadatos += f"Fabricante de la cámara: {value}\n"
|
177 |
-
elif tag == "Model":
|
178 |
-
info_metadatos += f"Modelo de la cámara: {value}\n"
|
179 |
-
elif tag == "Software":
|
180 |
-
info_metadatos += f"Software utilizado para editar la imagen: {value}\n"
|
181 |
-
elif tag == "ExifImageWidth":
|
182 |
-
info_metadatos += f"Ancho de la imagen: {value} píxeles\n"
|
183 |
-
elif tag == "ExifImageHeight":
|
184 |
-
info_metadatos += f"Alto de la imagen: {value} píxeles\n"
|
185 |
-
elif tag == "GPSInfo":
|
186 |
-
info_metadatos += "Información de ubicación GPS:\n"
|
187 |
-
coordenadas = obtener_coordenadas(metadatos)
|
188 |
-
if coordenadas:
|
189 |
-
latitud, longitud = coordenadas
|
190 |
-
enlace_google_maps = f"https://www.google.com/maps?q={latitud},{longitud}"
|
191 |
-
info_metadatos += f"- Coordenadas GPS: {latitud}, {longitud}\n"
|
192 |
-
info_metadatos += f"- Enlace a Google Maps: {enlace_google_maps}\n"
|
193 |
-
else:
|
194 |
-
info_metadatos += "- No se encontraron coordenadas GPS.\n"
|
195 |
-
else:
|
196 |
-
info_metadatos += f"{tag}: {value}\n"
|
197 |
-
else:
|
198 |
-
info_metadatos += "No se encontraron metadatos.\n"
|
199 |
|
200 |
# Analizar si la imagen ha sido manipulada
|
201 |
-
manipulada, razones = analizar_manipulacion(imagen, metadatos)
|
202 |
info_manipulacion = "\nAnálisis de manipulación:\n"
|
203 |
if manipulada:
|
204 |
info_manipulacion += "La imagen ha sido manipulada.\n"
|
@@ -208,15 +170,12 @@ def procesar_imagen(archivo_imagen):
|
|
208 |
else:
|
209 |
info_manipulacion += "La imagen NO ha sido manipulada.\n"
|
210 |
|
211 |
-
# Realizar Error Level Analysis (ELA)
|
212 |
-
ela_imagen = realizar_ela(imagen)
|
213 |
-
|
214 |
# Guardar la imagen ELA en un archivo temporal
|
215 |
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_file:
|
216 |
cv2.imwrite(tmp_file.name, ela_imagen)
|
217 |
ela_image_path = tmp_file.name
|
218 |
|
219 |
-
return ela_image_path, info_basica +
|
220 |
|
221 |
# Interfaz de GRADIO
|
222 |
iface = gr.Interface(
|
@@ -225,7 +184,7 @@ iface = gr.Interface(
|
|
225 |
outputs=[gr.Image(label="Error Level Analysis (ELA)"), gr.Textbox(label="Resultado del análisis")],
|
226 |
title="Análisis de metadatos y Error de ELA en imágenes digitales con Gradio",
|
227 |
description="""<div style="text-align: center;">
|
228 |
-
<p>Este programa es una herramienta de computación forense diseñado para analizar imágenes en busca de evidencia de manipulación o edición. Utiliza la técnica de Error Level Analysis (ELA)
|
229 |
</div>"""
|
230 |
)
|
231 |
|
|
|
6 |
from PIL.ExifTags import TAGS, GPSTAGS
|
7 |
import hashlib
|
8 |
import gradio as gr
|
|
|
|
|
9 |
import os
|
10 |
from datetime import datetime
|
11 |
|
|
|
67 |
imagen_bytes = imagen.tobytes()
|
68 |
return hashlib.md5(imagen_bytes).hexdigest()
|
69 |
|
70 |
+
def analizar_manipulacion(imagen, metadatos, ela_imagen):
|
71 |
"""
|
72 |
Analiza si la imagen ha sido manipulada.
|
73 |
"""
|
74 |
manipulada = False
|
75 |
razones = []
|
76 |
|
77 |
+
# Verificar si los metadatos están presentes
|
|
|
|
|
|
|
|
|
|
|
78 |
if not metadatos:
|
79 |
+
razones.append("La imagen no tiene metadatos EXIF, pero esto no es concluyente de manipulación.")
|
|
|
80 |
else:
|
81 |
if "Software" in metadatos:
|
82 |
razones.append(f"La imagen fue editada con: {metadatos['Software']}")
|
|
|
86 |
hash_conocido = "1a79a4d60de6718e8e5b326e338ae533" # Hash de ejemplo
|
87 |
hash_actual = calcular_hash(imagen)
|
88 |
if hash_actual != hash_conocido:
|
89 |
+
razones.append("El hash de la imagen no coincide con un hash conocido.")
|
90 |
+
|
91 |
+
# Evaluar los resultados del análisis ELA
|
92 |
+
promedio_ela = np.mean(ela_imagen)
|
93 |
+
if promedio_ela > 10: # Umbral arbitrario, ajustar según los datos
|
94 |
+
razones.append("El análisis ELA sugiere posibles alteraciones en la imagen.")
|
95 |
manipulada = True
|
96 |
|
97 |
return manipulada, razones
|
|
|
153 |
Fecha de modificación: {fecha_modificacion}
|
154 |
"""
|
155 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
# Obtener metadatos
|
157 |
metadatos = obtener_metadatos(imagen)
|
158 |
+
|
159 |
+
# Realizar Error Level Analysis (ELA)
|
160 |
+
ela_imagen = realizar_ela(imagen)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
|
162 |
# Analizar si la imagen ha sido manipulada
|
163 |
+
manipulada, razones = analizar_manipulacion(imagen, metadatos, ela_imagen)
|
164 |
info_manipulacion = "\nAnálisis de manipulación:\n"
|
165 |
if manipulada:
|
166 |
info_manipulacion += "La imagen ha sido manipulada.\n"
|
|
|
170 |
else:
|
171 |
info_manipulacion += "La imagen NO ha sido manipulada.\n"
|
172 |
|
|
|
|
|
|
|
173 |
# Guardar la imagen ELA en un archivo temporal
|
174 |
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_file:
|
175 |
cv2.imwrite(tmp_file.name, ela_imagen)
|
176 |
ela_image_path = tmp_file.name
|
177 |
|
178 |
+
return ela_image_path, info_basica + info_manipulacion
|
179 |
|
180 |
# Interfaz de GRADIO
|
181 |
iface = gr.Interface(
|
|
|
184 |
outputs=[gr.Image(label="Error Level Analysis (ELA)"), gr.Textbox(label="Resultado del análisis")],
|
185 |
title="Análisis de metadatos y Error de ELA en imágenes digitales con Gradio",
|
186 |
description="""<div style="text-align: center;">
|
187 |
+
<p>Este programa es una herramienta de computación forense diseñado para analizar imágenes en busca de evidencia de manipulación o edición. Utiliza la técnica de Error Level Analysis (ELA).</p>
|
188 |
</div>"""
|
189 |
)
|
190 |
|