leonett commited on
Commit
cce7214
·
1 Parent(s): d4a2b4e

Actualización del código Error ELA

Browse files
Files changed (1) hide show
  1. app.py +15 -56
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 la imagen tiene marcas de agua
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 el hash conocido.")
 
 
 
 
 
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
- info_metadatos = "\n" + "-" * 50 + "\nANÁLISIS FORENSE DE LOS METADATOS DE LA IMAGEN:\n"
171
- if metadatos:
172
- for tag, value in metadatos.items():
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 + info_metadatos + info_manipulacion
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) y fue desarrollado por José R. Leonett para los peritos forenses digitales de Guatemala <a href="http://www.forensedigital.gt">www.forensedigital.gt</a>, analistas forenses o cualquier persona interesada en verificar la autenticidad de imágenes digitales.</p>
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