Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Programa Criptografico (https://www.clubdelphi.com/foros/showthread.php?t=31882)

seoane 20-05-2006 15:40:50

Programa Criptografico
 
1 Archivos Adjunto(s)
Después de que diniremix publicara su programa para ocultar información en diferentes archivos gráficos, volvió a resurgir mi interés por la esteganografia y mas concretamente por como ocultar información dentro de un archivo jpeg.

Debido al método de compresión de las imágenes jpeg resulta muy difícil, sino imposible, ocultar información dentro de la propia imagen sin correr el riesgo de que la información se pierda durante este proceso. Así que me centre mas en el formato del propio archivo jpeg, sin entrar en muchos detalles, los archivos jpeg están divididos en segmentos y cada uno de estos segmentos contiene una información concreta. Uno de estos segmentos esta destinado a incluir comentarios (hasta 64Kb) , este es el que voy a utilizar, aunque también existen los llamados segmentos de aplicación destinados a que programas como photoshop o las propias cámaras digitales incluyan información sobre la imagen, utilizar uno u otro solo supone cambiar una línea dentro del código.

Con respecto a la parte criptográfica tampoco quise liarme mucho así que utilice la criptoapi del propio Windows, más concretamente el algoritmo RC4 que puede que no sea el más seguro del mundo pero si no nos persigue la CIA se puede considerar suficientemente seguro. (En windows98 parece que no funciona la encriptación, aunque tampoco voy a pararme a averiguar porque)

Bueno, echarle un vistazo al código haber que os parece, puede que a alguien le resulte útil alguna de la funciones que implemento, sobre todo las que utilizo para leer y escribir comentarios dentro del archivo jpeg o la que elimina los segmentos de comentario y aplicación de un archivo jpeg (limpia la imagen de información innecesaria). Si los queréis usar en vuestros programas adelante, cogerlos sin ningún problema.

Bueno aquí os dejo el código, si tenéis alguna pregunta, sugerencia, o crítica ponerla aquí. Y voy a dejar de escribir que me esta quedando un mensaje inmenso :D

Edito: Cambie el archivo zip, para corregir un pequeño error en la rutina de insertar comentario.

dec 20-05-2006 16:11:40

Hola,

¡Bajaaaando! Muchas gracias Seoane. :)

dec 20-05-2006 16:29:12

Hola,

He hechado un vistazo al programa muy por encima (el código se me hace muy complejo para mí, al menos ahora, que estoy en otros menesteres...) pero, qué decir, ha compilado a la primera perfectamente, ha funcionado como se espera sin ningún problema, y, salvo pequeños detalles sin importancia para lo que nos ocupa, me ha parecido un buen trabajo, algo curioso y que puede admirar.

Espero que no te importe que estrenara este WebLog contigo. Otra vez gracias. ;)

seoane 20-05-2006 16:41:14

Me siento muy honrado dec, y me alegro mucho de que te haya gustado.

dec 20-05-2006 16:46:10

Hola,

Eres tú quien merece agradecimiento Seoane. Pero no sigamos por aquí o no terminaremos nunca. :eek: :D

diniremix 21-05-2006 02:20:23

saludos a tod@s en el foro

amigo seoane como tal vez t diste cuenta con ETI (si lo bajaste y lo probaste:) ) el trabajar con imagenes no es tan dificil (bueno despues de unas mil tazas de cafe:o , 5 mil cigarrillos y como una semana sin dormir ;) )

es decir este tratamiento (el d las imagenes) lo puedes aplicar a casi (casi...) cualquier tipo de archivo sin importar cual..

ahora...tengo una duda sobre algo q dijiste:

Cita:

originalmente escrito por seoane
volvió a resurgir mi interés por la esteganografia y mas concretamente por como ocultar información dentro de un archivo jpeg.
vivo a veces en la luna q es esteganografia?...
ah otra cosa..

Cita:

originalmente escrito por seoane

Debido al método de compresión de las imágenes jpeg resulta muy difícil, sino imposible, ocultar información dentro de la propia imagen sin correr el riesgo de que la información se pierda durante este proceso.
como sabras las imagenes jpeg ó jpg (q es la misma vaina solo q depende el S.O. se Tratan solo con 3 en vez de 4 letras para las extensiones...)
estan ya compresos en la wikipedia te lo explican un poco mejor. y el ocultar el texto en la propia imagen se puede solo q la imagen al final parece q le hubiera dado sarampion:D

sobre esto.
Cita:

originalmente escrito por seoane

Con respecto a la parte criptográfica tampoco quise liarme mucho así que utilice la criptoapi del propio Windows, más concretamente el algoritmo RC4 que puede que no sea el más seguro del mundo pero si no nos persigue la CIA se puede considerar suficientemente seguro. (En windows98 parece que no funciona la encriptación, aunque tampoco voy a pararme a averiguar porque)
m parece muy interesante pero cabe anotar q guindow$ y M$ son un poco tanto "jodidos" (por no decir malas palabras y q m expulsen....) con sus "vainas" yo opino (y solo eso) q deberias crear tus propios sistemas de cifrado ya q nop solo aprenderias sip nop tambien podrias liberar (en un futuro..) el codigo y nop tendras ningun problema ya q es originalmente tuyo.
t lo digo ya q tuve una mala experiencia.:(

antes d q ETI se llamara ETI (valga la redundancia)

se llamaba "MsnPicture" algo como "mensajes en las imagenes"
hasta ahí todo bien pero como la palabra Msn esta protegida por una patente de M$ m jodieron en un foro cuando decidi publicar su version 2.0 asip q tuve q cambiarle el nombre al proyecto:mad:
decidí peliar pero nop tenia tanta plata para demandar a M$:D

a d + sip t interesa en pocos dias terminare ETI 2.0 y publicare el proyecto y el SRC de la version 1.0 y os podeis mirar la parte de encriptacion...
bueno.. pero quien soy yo para decirte solo haz lo q quieras pero con cuidado :D

seoane 21-05-2006 02:52:09

amigo diniremix

Cita:

como tal vez t diste cuenta con ETI (si lo bajaste y lo probaste ) el trabajar con imagenes no es tan dificil (bueno despues de unas mil tazas de cafe , 5 mil cigarrillos y como una semana sin dormir )
Tu programa, segun pude ver, solo coloca la informacion pegada al final del archivo jpeg. De esta manera el archivo deja de cumplir con el estandar, ya que estas modificando su estructura como a ti te da la gana. Tienes suerte de que la mayoria de los programas que lee las imagenes jpeg ignora esa informacion, pero no tienen porque hacerlo incluso podrian entender que el archivo esta corrupto, o tener cualquier otro efecto no deseado.

Cita:

vivo a veces en la luna q es esteganografia?...
http://es.wikipedia.org/wiki/Esteganografía

Cita:

estan ya compresos en la wikipedia te lo explican un poco mejor. y el ocultar el texto en la propia imagen se puede solo q la imagen al final parece q le hubiera dado sarampion
Por supuesto que se que jpg y jpeg son dos extensiones del mismo tipo de archivo, y yo me referia a que en otro formatos graficos sin compresion o con compresion sin perdida se puede ocultar la informacion dentro de la propia imagen sin que este cambio sea apreciable, de echo existen multiples algoritmos diseñados a tal fin, los trata una rama de la criptografia que se llama esteganografia ;) no se si te suena.

Cita:

m parece muy interesante pero cabe anotar q guindow$ y M$ son un poco tanto "jodidos" (por no decir malas palabras y q m expulsen....) con sus "vainas" yo opino (y solo eso) q deberias crear tus propios sistemas de cifrado ya q nop solo aprenderias sip nop tambien podrias liberar (en un futuro..) el codigo y nop tendras ningun problema ya q es originalmente tuyo.
Utilizo la API criptografica que microsoft pone a disposicion de los programadores para que hagan sus aplicaciones, decir que tengo que pedir permiso para usarla es como decir que tengo que pedir permiso para crear una ventana o usar un boton ya que estos tambien se crean con llamadas a las api.

dec 21-05-2006 05:44:33

Hola,

Cita:

Empezado por Seoane
Y no me lo estoy tomando a mal, pero no intentes darme clases de algo de lo que realmente no sabes apenas nada ...

En mi opinión (a lo que se ve) no creo que exista ninguna intención por parte de Diniremix de darte clases Seoane. ¡Venga la paz! :)

seoane 21-05-2006 12:24:38

Tienes razon la ultima frase sobraba, pero me deje llevar. :o

[Gunman] 21-05-2006 14:18:18

Yo no sé nada de criptografia, sólo digo que ya existe la compañia Steganos (con programas criptográficos también), ten cuidado a ver si te van a "joder"...
EDICIÓN: "el programa" por "la compañia"

seoane 21-05-2006 16:07:42

;) No te preocupes el codigo solo era un ejemplito, no creo que nadie se moleste :o aunque demuestra mi poca imaginacion a la hora poner nombre a los programas. Le podia haber puesto "Mensajes ocultos" pero me parecia el nombre de un accesorio de la barbie :D (barbie mensajes secretos)

Por cierto, aprovecho para decir algo que creo que no deje claro, esto no intenta ser un programa para distribuir. Solo es una demostracion de como escribir informacion en el segmento destinado a comentarios dentro de un archivo jpg. Por eso pongo el codigo y no el ejecutable, por eso la presentacion del programa esta tan poco cuidada (solo me he centrado en la funciones de leer y escribir) y por eso no me molesto en hablar de licencias, copyright, etc ... solo queria compartir el codigo con otros programadores.

[Gunman] 21-05-2006 23:43:32

Todo aclarado!
Cita:

Empezado por seoane
solo queria compartir el codigo con otros programadores.

Me parece fantástico que compartas tu conocimiento con nosotros, yo si supiese algo haría lo mismo y siempre que hago(a) algo también os lo comunico(aré).

diniremix 22-05-2006 19:35:19

hola a tod@s
salu2
Cita:

originalmente escrito por dec
En mi opinión (a lo que se ve) no creo que exista ninguna intención por parte de Diniremix de darte clases Seoane. ¡Venga la paz! :)
amig@s mi@s d mi par t disculpas a tod@s los ofendid@s por todas estas locura:o s
amig@ seoane gracias a la cita del amigo [Gunman]

Cita:

originalmente escrito por [Gunman]
Me parece fantástico que compartas tu conocimiento con nosotros, yo si supiese algo haría lo mismo y siempre que hago(a) algo también os lo comunico(aré).
he decidido hacer lo mismo q el o tú, sabes eres bien listo y creo (creo solamente!!) q seria bueno (magnifico) seguir el ejemplo q cita el amigo [Gunman].

a tod@s los del foro salu2 y gracias por dejar aprender un poco de ustedes cada dia

"es licito aprender hasta del enemigo"
bytes cuidense

[Gunman] 23-05-2006 19:16:52

Bueno, ya he instalado el Delphi y he probado el programa Esteganos...
Y ya que estamos hablando de compartir conocimiento... Cómo le haces una paella a un aprendiz y no le pones la receta? Por favor, explicanos el código seoane, a los analfabetos como yo. El programa con el código comentado y enlaces donde encontrar información extra seria de gran untilidad, pero bueno...

seoane 23-05-2006 20:26:36

Lo de no comentar el codigo es una fea costumbre que tengo, pero estoy encantado de comentarlo si esta interesado. Para no volver a subir el proyecto voy a ir poniendo aqui varias de las funciones ya comentadas:


Estas funciones manejan el archivo JPEG una vez lo tenemos en un stream
Código Delphi [-]
// Esta funcion lee el comentario de un archivo JPEG.
// El archivo JPEG esta dividido en segmentos con el siguiente formato
// Identificador (2Bytes) + Longitud (2Bytes) + Contenido
// Asi que vamos leyendo segmento a segmento hasta encontrar el que nos interesa
function LeerCom(Stream: TStream): string;
var
  Buffer: array[0..$FFFF] of Char;
  Header: array[1..4] of byte;
  Size: Integer;
begin
  // Nos colocamos al principio del archivo
  Stream.Seek(0,soFromBeginning);
  // Leemos los 2 primeros Bytes
  Stream.ReadBuffer(Header,2);
  // Y comprobamos que son correctos  (todos los JPEG empiezan por FF D8)
  if (Header[1] <> $FF) or (Header[2] <> $D8) then
    // Si no es asi, provocamos un error
    raise Exception.Create('Identificador incorrecto');
  repeat
    // Leemos los 4 primeros bytes del segemento
    Stream.ReadBuffer(Header,4);
    // Usamos los 2 ultimos bytes para calcular el tamño del segmento
    // que es igual al tamaño del contenido + 2, asi que le restamos 2
    Size:= ((Header[3] shl 8) + Header[4]) - 2;
    // Todos los segmentos comienzan por FF asi que utilizamos el segundo
    // byte para identificarlos
    case Header[2] of
      // FE corresponde al segemnto con los comentarios
      $FE: begin
             FillChar(Buffer,Sizeof(Buffer),0);
             // Leemos el contenido del segemento
             Stream.ReadBuffer(Buffer,Size);
             // Y lo convertimos en un string
             Result:= String(PChar(@Buffer));
           end;
      // Estos segemntos son casos especiales, solo miden 2 bytes, asi que
      // restrocedemos el puntero 2 bytes hacia atras
      $01,$D0..$D9: Stream.Seek(-2,soFromCurrent) ;
      // Si no es ni un comentario ni un caso especial, adelantamos el puntero
      // hasta el siguiente segmento
      else Stream.Seek(Size,soFromCurrent);
    end;
  // Salimos del bucle si ya hemos leido el comentario o llegamos al ultimo
  // segmento, ya que a partir de aqui el archivo solo contiene informacion
  // correspondiente a la propia imagen.
  until (Result <> '') or (Header[2] = $DA);
end;

// Esta funcion inserta un comentario. Hay que tener en cuenta que si hay un
// comentario anterior no se elimina, asi que deberemos usar antes la
// funcion "Limpiar" para quitar los comentarios anteriores.
procedure InsertarCom(Origen, Destino: TStream; Comment: string);
var
  Buffer: array[0..$FFFF] of Char;
  Header: array[1..4] of byte;
  Size: Integer;
begin
  // No colocamos al principio del archivo
  Origen.Seek(0,soFromBeginning);
  // Leemos los 2 primeros bytes
  Origen.ReadBuffer(Header,2);
  // y comprobamos que son correctos
  if (Header[1] <> $FF) or (Header[2] <> $D8) then
    raise Exception.Create('Identificador incorrecto');
  // Escribimos los 2 primeros bytes
  Destino.WriteBuffer(Header,2);
  // Calculamos la longitud del segmento
  Size:= Length(Comment) + 2;
  Header[1]:= $FF;
  Header[2]:= $FE;
  Header[3]:= Size div 256;
  Header[4]:= Size mod 256;
  // Copiamos el comentario a un buffer
  StrCopy(@Buffer,PChar(Comment));
  // Escribimos la cabecera del segmento
  Destino.WriteBuffer(Header,4);
  // Escribimos el contenido del segmento
  Destino.WriteBuffer(Buffer,Length(Comment));
  // Copiamos el resto
  Destino.CopyFrom(Origen,Origen.Size - Origen.Position);
end;

// Esta funcion elimina los segmentos resrvados para comentarios y para
// aplicaciones, informacion que nos es necesaria para ver la imagen. Hay
// que tener cuidado porque algunas aplicaciones guardan informacion ahi, por
// ejemplo cuando fue tomada la foto o que camara se uso.
procedure Limpiar(Origen, Destino: TStream);
var
  Buffer: array[0..$FFFF] of Char;
  Header: array[1..4] of byte;
  Size: Integer;
begin
  // Nos colocamos al principio del archivo
  Origen.Seek(0,soFromBeginning);
  // Leemos los 2 primeros bytes
  Origen.ReadBuffer(Header,2);
  // Comprobamos que son correctos
  if (Header[1] <> $FF) or (Header[2] <> $D8) then
    raise Exception.Create('Identificador incorrecto');
  Destino.WriteBuffer(Header,2);
  // Leemos segemento a segmento
  repeat
    Origen.ReadBuffer(Header,4);
    Size:= ((Header[3] shl 8) + Header[4]) - 2;
    case Header[2] of
      // Si es un comentario o un segmento de aplicacion saltamos al siguiente
      $FE, $E0..$EF: Origen.Seek(Size,soFromCurrent);
      // Si es un caso especial retrocedemos 2 bytes
      $01,$D0..$D9: begin
                      Destino.WriteBuffer(Header,2);
                      Origen.Seek(-2,soFromCurrent)
                    end
      else
      // Si es un segmento normal lo copiamos
      begin
        Origen.ReadBuffer(Buffer,Size);
        Destino.WriteBuffer(Header,4);
        Destino.WriteBuffer(Buffer,Size);
      end;
    end;
  until Header[2] = $DA;
  // Copiamos el resto del archivo
  Destino.CopyFrom(Origen,Origen.Size - Origen.Position);
end;

Para mas informacion sobre el formato de archivo JPEG
http://www.wotsit.org/search.asp?page=5&s=graphics

PD: Al comentar la funcion de insertar comentario me di cuenta de que daba mas pasos de los necesarios, debido a una confusion que tenia con respecto al primer segmento. :o Esto demuestra que nunca esta mal repasar el codigo

seoane 23-05-2006 20:48:53

Con respecto a las funciones criptograficas, poco se puede decir, estan basadas en estos ejemplos que tiene microsoft en su pagina

Encriptar y Desencriptar

Aunque los ejemplos muestran como encriptar unos archivos y estan en C pero mas o menos es lo mismo, son los mismos pasos.

Por ultimo, a lo mejor llama la atencion porque importo una a una las funciones criptograficas de la API, muy sencillo, la version 7 de delphi no tiene ninguna libreria que lo haga, supongo que en versiones posteriores ya lo hara pero tampoco lo se. De todas formas creo que en JEDI tenian disponible una libreria para usar esta API.

dec 24-05-2006 05:06:05

Hola,

Cita:

Empezado por Seoane
De todas formas creo que en JEDI tenian disponible una libreria para usar esta API.

Yo no he podido encontrarla en la versión 3.0. Los comentarios que das están muy bien y también los enlaces que das como referencia.

Neftali [Germán.Estévez] 24-05-2006 12:00:55

Cita:

Empezado por seoane
...si tenéis alguna pregunta, sugerencia, o crítica ponerla aquí...

Unos unos Hints en los botones (al menos) no hubieran estado mal...:D
No en serio, está muy bien; El código es muy ilustrativo (sin comentarios :D), pero muy ilustrativo. Muy interesante.

Me ha resultado curioso, que la imagen con mensaje ocupe menos que la original... Supongo que debido al factor de compresión estandard de los JPG. Si es así (que no lo se) ¿Se podría fijar a 100% para añadir información y no perder calidad? (tal vez estoy diciendo una salvajada soane, corrígeme si es así).

Un saludo.

seoane 24-05-2006 12:21:49

La imagen resultante ocupa menos porque elimino del archivo todos los comentarios anteriores y los segmentos de aplicacion. Estos segementos de aplicacion los añaden algunas aplicaciones con informacion extra, como cuando se hizo la foto o incluso thumbnails de la propia imagen. En archivos grandes apenas se notan pero en pequeños pueden llegar a "engordar" bastante el archivo. Por ahi circulan programas que dicen "optimizar" los archivos jpeg que hacen lo mismo, la gente cobra por cada cosa ... :D

En cuanto a la calidad no se cambia nada, porque la parte del archivo que contiene la informacion sobre la imagen se copia sin alterar, la imagen no se "recomprime" y por lo tanto no se pierde calidad en el proceso.

Neftali [Germán.Estévez] 24-05-2006 13:00:24

Ok, ya me parecía raro el tema de la pérdida de calidad, pero no le encontraba otra explicación.

Osea, usas JPG porque comprime mucho la imagen y luego te ponen los comentarios y demás que ocupa espacio innecesario... ¡¡¡Manda cojones!!!

Gracias por la aclaración.

P.D: Otra curiosidad; Aunque el programa trabaja con imágenes JPEG y añades la unidad JPEG, si la eliminas compila perfectamente. ;)


La franja horaria es GMT +2. Ahora son las 23:03:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi