View/Open

Anuncio

INSTITUTO
POLITECNICO
NACIONAL
ESCUELA
SUPERIOR
DE
INGENIERIA
MECANICA
Y
ELECTRICA
UNIDAD
CULHUACAN
SECCIÓN
DE
ESTUDIOS
DE
POSTGRADO
E
INVESTIGACIÓN
ESPECIALIZACIÓN
EN
SEGURIDAD
INFORMÁTICA
Y
TECNOLOGIAS
DE
LA
INFORMACIÓN
PRESENTA:
CANO
JIMÉNEZ
ABEL
OCULTAMIENTO
DE
INFORMACIÓN
EN
DOCUMENTOS
ELECTRONICOS
DE
TIPO
POSTSCRIPT
PARA
OBTENER
EL
TITULO
DE
ESPECIALISTA
EN
SEGURIDAD
INFORMÁTICA
Y
TECNOLOGÍAS
DE
LA
INFORMACIÓN
ASESOR:
DR.
MARIO
GONZÁLEZ
LEE
1
2
3
CONTENIDO
CONTENIDO ................................................................................................................................................ 4
INTRODUCCION ............................................................................................................................................. 9
CAPITULO
1....................................................................................................................................................10
HIPOTESIS .................................................................................................................................................10
OBJETIVO ...................................................................................................................................................11
PLANTEAMIENTO
DEL
PROBLEMA ...............................................................................................12
DELIMITACIÓN........................................................................................................................................14
ESQUEMA ...................................................................................................................................................15
ESTADO
DEL
ARTE ................................................................................................................................16
Steganopic
0.1
(Windows)............................................................................................................17
Cloak
7.0
(Windows)........................................................................................................................17
CryptoMX
1.1
(Win
Mac
Lin) ........................................................................................................17
Dound’s
Steganography
1.6
(Windows) ..................................................................................17
Hip
2.0
(Windows) ............................................................................................................................17
UnderMP3Cover
1.1
(Linux).........................................................................................................17
Hide
In
Picture
2.1
(Windows) ....................................................................................................18
S−Tools
(Windows) ..........................................................................................................................18
Wodax
1.2
(Windows) .....................................................................................................................18
Absolute
Chaos
3.8
(Windows)....................................................................................................18
Hide
In
Picture
2.1
(Windows) ....................................................................................................18
MP3Stego
(Windows,
Linux) ........................................................................................................18
Invisible
Secret
4
(Windows) .......................................................................................................18
InvisibleInk
(Windows) ..................................................................................................................19
Steganography
(Windows)............................................................................................................19
Hermetic
Stego
(Windows) ...........................................................................................................19
4
BitCrypt
(Windows) .........................................................................................................................19
Bon
Kyu
Bon
1.1.3011
(Windows).............................................................................................19
SteganoG
1.21
(Windows) .............................................................................................................20
PicCrypt
0.3
(Windows)..................................................................................................................20
Xiao
Steganography
2.6.1
(Windows) ......................................................................................20
ByteShelter
1
(Windows)...............................................................................................................21
Digital
Identity
1.0.16
(Windows)..............................................................................................21
HIP
(Hide
In
Picture)
2.1
(Windows)........................................................................................22
Secure
Share
1.0
(Windows).........................................................................................................22
StegHide
(Windows,
Linux)...........................................................................................................22
AdaStegano
(Windows,
Linux).....................................................................................................22
CryptArkan
(Windows)...................................................................................................................23
Xidie
Security
Suite
(Windows)...................................................................................................23
OutGuess
(Unix
Linux).....................................................................................................................23
Camera
/
Shy
(Windows)...............................................................................................................23
JPHIDE
y
JPSEEK
(Windows)........................................................................................................23
Hydan
(Unix
Linux
Windows)......................................................................................................24
CAPITULO
2....................................................................................................................................................25
POSTSCRIPT..............................................................................................................................................25
Lenguajes
de
Descripción
de
Pagina ..............................................................................................26
Estructura
del
Lenguaje.......................................................................................................................26
Programación
en
PostScript ..............................................................................................................27
Números .....................................................................................................................................................28
Strings..........................................................................................................................................................28
Nombres .....................................................................................................................................................29
Arreglos.......................................................................................................................................................29
Procedimientos........................................................................................................................................29
5
Ejecución ....................................................................................................................................................29
Estructuras
de
control..........................................................................................................................30
SELECCIÓN
DEL
LENGUAJE
DE
PROGRAMACIÓN ...................................................................32
SELECCIÓN
DE
MODULOS
A
DESARROLLAR .............................................................................32
CAPITULO
3....................................................................................................................................................34
ARCHIVOS
DE
TEXTO ...........................................................................................................................34
ARCHIVOS
POSTCRIPT.........................................................................................................................35
FORMATOS
COMPARATIVOS
TEXTO
Y
POSTSCRIPT.............................................................36
CAPITULO
4....................................................................................................................................................37
DESARROLLO
DEL
GENERADOR .....................................................................................................37
Modo
de
Funcionamiento ..............................................................................................................38
Técnica
Esteganografica .................................................................................................................40
DESARROLLO
DEL
EXTRACTOR ......................................................................................................44
Uso
Ciclo
Ocultamiento
–
Recuperación .......................................................................................46
Parámetros
para
el
Ocultamiento....................................................................................................46
Parámetros
y
uso
de
Portadores.................................................................................................48
Parámetros
y
uso
de
Extracción..................................................................................................51
CAPITULO
5....................................................................................................................................................55
PRUEBA
MOS............................................................................................................................................55
Elaboración...........................................................................................................................................55
RESULTADOS............................................................................................................................................59
APLICACIONES
Y
USOS ........................................................................................................................61
CAPITULO
6....................................................................................................................................................63
Modificaciones
Futuras........................................................................................................................63
POSIBLES
MEJORAS...............................................................................................................................63
Ampliar
opciones
de
Formato......................................................................................................64
Criptografía
antes
de
Esteganografía........................................................................................64
6
Disminuir
tamaño
de
archivos
finales ......................................................................................64
Incluir
archivos
multimedia..........................................................................................................65
Incluir
archivos
binarios
o
ejecutables.....................................................................................65
Compilación
en
otros
Sistemas
Operativos............................................................................66
CAPITULO
7....................................................................................................................................................67
CONCLUSIONES.......................................................................................................................................67
BIBLIOGRAFIA .........................................................................................................................................68
ANEXO
1......................................................................................................................................................70
Código
Fuente
del
Generador.......................................................................................................70
Código
Fuente
del
Extractor .........................................................................................................81
Fig.
1.
Bloques
de
Desarrollo ..............................................................................................................15
Fig.
2.
Tabla
de
Codificaciones ...........................................................................................................27
Fig.
3.
Flujo
de
Esteganografía
Propuesto.....................................................................................33
Fig.
4.
Flujo
de
Extracción
Propuesto..............................................................................................33
Fig.
5.
Aspecto
del
generador
sobre
la
línea
de
comando ......................................................37
Fig.
6.
Flujo
de
Ocultación
de
Información ...................................................................................38
Fig.
7.
Archivo
de
Texto
Portador .....................................................................................................39
Fig.
8.
Archivo
PostScript
resultante ...............................................................................................40
Fig.
9.
Métricas
de
un
carácter ...........................................................................................................41
Fig.
10.
Comparativa
de
Textos..........................................................................................................42
Fig.
11.
Estructura
PostScript
con
información
Oculta ...........................................................42
Fig.
12.
Estructura
PostScript
sin
información
Oculta.............................................................43
Fig.
13.
Archivo
PostScript
Sin
Información
Oculta ..................................................................43
Fig.
14.
Archivo
PostScript
Con
Información
Oculta ................................................................43
7
Fig.
15.
Comando
de
Generación
de
PS
con
información
Oculta.........................................44
Fig.
16.
Flujo
de
Extracción..................................................................................................................45
Fig.
17.
Utilización
en
línea
de
comando
para
el
programa
Extractor..............................46
Fig.
18.
Definición
de
Parámetros
de
formato
en
ejecución
del
programa
generador
47
Fig.
19.
Estructura
de
ficheros
ejemplo
en
Sistema
de
Archivos ........................................48
Fig.
20.
Ejemplo
de
contenido
en
archivos
de
Texto ................................................................49
Fig.
21.
Nombres
de
archivos
PS
generados ................................................................................49
Fig.
22.
Comparativa
ente
texto
plano
y
texto
en
PostScript ................................................50
Fig.
23.
Archivos
de
prueba
para
Extracción ...............................................................................51
Fig.
24.
Apariencia
de
una
recuperación
de
Información.......................................................52
Fig.
25.
Ejemplo
de
Ocultación
entre
el
mismo
texto ...............................................................53
Fig.
26.
Extracción
de
un
archivo
oculto
en
si
mismo ..............................................................54
Fig.
27.
Formato
para
evaluación
MOS
de
Impresiones
PS ...................................................56
Fig.
28.
Primer
Memorando
(Texto
1) ............................................................................................57
Fig.
29.
Segundo
Memorando
(Texto
2).........................................................................................57
Fig.
30.
Parte
de
Texto
Largo
en
PostScript
(Texto
3) .............................................................58
Fig.
31.
Comparación
Binaria..............................................................................................................60
8
INTRODUCCION
El
ocultamiento
y
la
protección
de
la
información,
siempre
será
un
tema
de
interés
desde
nivel
personal
hasta
masivo,
refiriéndonos
a
un
interés
por
gobiernos
o
milicia;
así
para
la
parte
que
involucra
el
ocultamiento
o
protección
como
se
menciona
en
la
hipótesis
y
en
base
a
la
premisa
que
las
necesidades
de
protección,
se
tienen
diferentes
soluciones,
estas
soluciones
son
varias,
sin
embargo
estudiamos
una
que
puede
presentarse
comúnmente
en
el
medio
computacional
y
particularmente
en
un
tratamiento
especifico
a
la
forma
de
utilizar
textos
en
formato
electrónico
PostScript
y
en
estos
su
capacidad
de
especificar
con
alta
precisión
ubicaciones
de
letras
en
un
documento
electrónico
de
esa
naturaleza
y
así
aprovechar
dicha
característica
para
poder
ocultar
información
ante
una
lectura
al
documento
electrónico
PostScript
final.
En
el
desarrollo
de
programas
que
involucren
al
computo,
generalmente
se
ocupan
variadas
metodologías
de
ocultamiento
así
que
en
este
trabajo
nos
ocuparemos
de
utilizar
Esteganografía
con
texto
para
formatos
de
impresión
electrónica
por
medio
de
PostScript,
definiendo
mas
adelante
algunos
temas,
problemas
y
delimitaciones
para
alcanzar
los
objetivos
de
este
proyecto.
9
CAPITULO
1
HIPOTESIS
La
Esteganografía
oferta
muy
variadas
y
efectivas
formas
de
proteger
y
ocultar
información
o
datos;
con
esta
disciplina
se
han
desarrollado
muy
diferentes
maneras
para
trasportar
información
en
determinado
medio
con
mas
de
lo
que
se
pueda
pensar
en
una
primera
vista
hacia
dicha
representación.
Lao
anterior
se
ha
desarrollado
desde
tiempos
remotos
hasta
nuestros
días,
han
existido
muchas
técnicas
diferentes
aún
cuando
se
requiera
ocultar
el
mismo
tipo
de
información,
un
ejemplo;
si
se
deseaba
ocultar
un
mensaje
de
texto
se
logra
por
medio
de
micro
puntos
señalando
una
letra
dentro
de
un
texto
para
formar
una
oración,
otro
ejemplo
esta
en
que
se
rapaba
a
una
persona
de
manera
que
se
perdiera
de
vista
el
mensaje
entre
el
resto
del
cabello;
siempre
cumpliendo
la
finalidad
de
poder
pasa
alguna
información
inadvertida
por
demás
medios
o
personas
que
estén
al
tanto
de
poder
sospechar
o
percatarse
de
que
se
transmite
información
importante.
Con
lo
anterior
se
cumple
la
finalidad
original
de
la
Esteganografía,
que
es
ocultar
información
en
un
medio,
a
manera
de
que
no
levante
sospecha
alguna
de
que
existe
mas
información
de
la
que
se
observa
a
simple
vista.
En
el
transcurrir
del
tiempo
y
el
avance
de
la
tecnología
el
ser
humano
se
ha
apoyado
de
su
ingenio
para
mezclar,
usar
y
desarrollar
nuevas
formas
de
ocultar
información.
Actualmente
el
uso
de
la
computadora
ha
facilitado
en
gran
media
el
ocultar
información
en
datos,
estos
datos
pueden
representar
alguna
información
diferente
entre
una
y/o
otra
persona,
siendo
así
que
se
tiene
una
gran
capacidad
de
enmascaramiento
de
información
en
estos
medios
digitales
logrando
transportar
mas
información
de
lo
que
parece,
hoy
en
día
se
ha
hecho
uso
de
imágenes,
sonido
y
video
principalmente,
sin
descartar
al
texto
para
ocultar
información,
sin
embargo
en
este
ultimo
medio
(el
Texto
plano)
al
usarse,
se
ha
requerido
de
bastante
cantidad
de
texto
para
transportar
determinada
cantidad
de
algún
otro
contenido,
lo
que
hace
variar
según
la
complejidad
de
los
algoritmos
utilizados
resultando
por
ahora
los
mejores
en
desarrollos
sobre
ocultamiento
en
texto
a
los
proyectos
privados.
Con
lo
anterior
dicho
acerca
de
la
información
oculta;
dentro
de
este
trabajo
nos
enfocamos
a
desarrollar
una
forma
de
lograr
mayor
cantidad
de
información
transportada
mediante
otro
texto,
este
texto
que
en
un
formato
electrónico
debe
poderse
leer
la
misma
información
que
la
fuente
original,
que
es
un
texto
plano
y
ser
transportando;
a
pesar
de
que
el
formato
electrónico
final
sea
mas
grande
para
almacenamiento
en
disco,
esto
ocurrirá
por
respetar
determinada
estructura
del
lenguaje
seleccionado
que
en
este
desarrollo
será
PostScript.
10
OBJETIVO
Con
fundamento
en
la
Esteganografía
se
tendrá
una
implementación
en
Software
para
ocultación
y
protección
de
información
de
texto
en
texto,
representado
por
medio
de
un
formato
electrónico
de
visualización
de
documentos
en
pantalla
y
dispositivos
de
impresión
conocido
como
PostScript,
que
debe
ser
capaz
ademas
de
poder
mostrar
en
pantalla
un
texto
predefinido,
debe
poder
transportar
determinada
cantidad
de
información
oculta
y
finalmente
esta
implementación
debe
ser
capaz
de
extraer
la
información
que
se
haya
logrado
ocultar
en
este
medio
electrónico.
La
implementación
debe
tener
finalmente
dos
módulos
específicos
y
dedicados
a
su
tarea
correspondiente;
la
generación
y
extracción
de
la
información
oculta
respectivamente.
Ambas
partes,
la
generación
y
la
extracción
deben
satisfacer
las
siguientes
características:
•
•
•
•
Ejecutarse
sobre
línea
de
comandos.
Aceptar
parámetros
de
trabajo.
El
código
fuente
debe
ser
portable
a
mas
Sistemas
Operativos.
El
trabajo
de
cada
modulo
debe
ser
veloz.
Particularmente
y
adicionalmente
la
implementación
encargada
de
generar
el
archivo
debe:
•
•
•
•
Tomar
uno
o
mas
archivos
especificados
en
una
ruta
como
fuentes
para
en
estos
ocultar
otra
información
en
un
formato
electrónico
PostScript
por
cada
archivo
de
texto
localizado.
Tomar
un
archivo
especifico
para
ocultar
en
los
archivos
anteriormente
señalados.
Generar
el
formato
PostScript
que
contiene
la
información
oculta,
visualizando
otra
originalmente
especificada.
Tomar
valores
básicos
para
visualización
del
formato
final
en
pantalla.
Para
la
implementación
de
la
Extracción
se
debe
tener:
•
•
La
capacidad
de
especificarse
el
archivo
PostScript
que
contiene
la
información
Oculta.
El
archivo
que
contendrá
la
información
que
se
recupere
del
archivo
PostScript
que
anteriormente
se
ha
especificado.
11
PLANTEAMIENTO
DEL
PROBLEMA
Actualmente
existen
muchas
formas
de
ocultar
y
proteger
información
de
muy
variados
tipos,
desde
mensajes
hasta
contenido
multimedia,
estas
formas
se
derivan
de
dos
grandes
ramos,
la
Criptografía
y
la
Esteganografía.
Básicamente
el
ocultamiento
y
por
supuesto
la
protección
de
la
información,
son
el
objetivo
de
ambas
disciplinas
con
determinada
información,
manteniendo
la
posibilidad
al
final
de
un
proceso
de
tener
una
recuperación
de
determinada
información
para
que
los
datos
sensibles
sean
reconocidos
o
reconstruidos
por
algún
destinatario
final;
una
y
otra
utilizan
técnicas
diferentes
de
manejar
dichas
protecciones;
cada
una
con
sus
propias
características
defienden
metas
particulares
de
prestaciones.
Es
claro
que
ambas
disciplinas
han
crecido
y
tienen
sus
origenes
desde
mucho
tiempo
atrás,
pero
siempre
con
una
marcada
diferencia
que
crea
el
parte
aguas
de
sus
usos,
esta
diferencia
radica
básicamente
en
estilo
o
forma
visual
final
que
pueden
tener,
por
ejemplo
para
manejar
textos,
la
frase:
“Luego
de
el
nombre
de
usuario
de
escribe
la
contraseña.”
Cada
que
observamos
una
frase
común
como
la
anterior,
que
tiene
un
sentido
como
oración
y
que
también
podría
no
tener
algún
valor
para
mas,
por
la
misma
naturaleza
de
la
misma
fácilmente
tenderíamos
a
menospreciarle
y
perderle
interés
de
análisis.
Aplicando
un
método
Criptográfico
para
proteger
la
oración
anterior,
es
normal
observar
una
cadena
de
texto
similar
a
la
siguiente:
“NjfKwoHJFLsfsdf
fkjslfk
.kjeoejsf*ç`¡’sdfdfç+sdf’¡’´ñ+çSFeRFffgDVBTfgH”
Observar
la
cadena
anterior,
generaría
muchas
ideas
acerca
de
lo
que
pudiera
esconder,
que
bien
podría
ser
cualquier
cosa,
por
lo
que
se
levanta
una
sospecha
inmediata
y
se
puede
aplicar
un
tratamiento
inverso
a
manera
de
atacar
el
sistema
de
protección
y
tratar
de
revelar
la
información.
Situación
que
se
esquiva
en
la
Esteganografía,
pues
ademas
de
la
comparación
visual
con
las
oraciones
que
se
ha
presentado
entre
las
disciplinas
de
Esteganografía
y
Criptografía,
también
acabamos
de
tener
frente
a
nosotros
un
ejemplo
de
Esteganografía
aplicada;
pues
se
ha
transmitido
el
texto
“ABELCANO”
dado
que
en
los
párrafos
anteriores
incluyendo
este
se
toma
cada
letra
inicial
incluyendo
las
oraciónes
de
ejemplo.
12
En
base
a
lo
anterior
y
en
el
caso
de
aplicar
la
particularidad
de
no
levantar
sospecha
sobre
el
envío
o
protección
de
mas
información
ademas
de
la
que
se
logra
ver
y/o
hasta
cierto
punto
distinguir
entre
que
es
algún
criptograma
o
algo
que
pretende
a
simple
vista
ocultar
algo
otro,
o
también
que
aparentemente
no
es
de
lo
que
nos
interese
sospechar,
se
tiene
a
la
Esteganografía
como
solución.
La
Esteganografía
ha
sido
utilizada
desde
hace
tiempos
muy
remotos
y
de
muy
variadas
formas,
por
mencionar
una
manera,
cuenta
una
historia
de
un
rey
que
deseaba
trasmitir
información
hacia
un
destino
lejano
y
con
muchos
espías
hacia
su
reino,
se
le
ocurrió
rapar
a
sus
súbditos
en
algunas
partes
y
formas
de
sus
cabezas,
esperar
a
que
el
resto
del
cabello
cubriera
lo
suficiente
el
mensaje
y
enviarlos
para
que
el
mensaje
pasara
desapercibido
hasta
llegar
a
su
destino
y
pudiera
ser
observando.
Pero
existe
una
variante
muy
particular
de
uso
desde
tiempos
anteriores
hasta
actuales,
esta
es
relacionada
con
el
texto
que
oculta
otro
texto,
estos
mensajes
utilizando
el
texto
como
medio
de
transporte
para
ocultar
y
proteger
información
han
resultado
un
medio
que
esta
caracterizado
por
transportar
poca
información
en
comparación
a
los
demás
métodos,
debido
a
que
se
tienen
que
especificar
diferentes
y
entre
textos
ocasionalmente
distantes
características,
así
como
formas
de
recuperar
el
mensaje,
es
decir
que
se
han
hecho
por
ejemplo
una
recuperación
de
texto
oculto
cada
número
de
caracteres
predeterminados
o
cada
que
se
cumpla
una
condición,
por
ejemplo
cada
letra
mayúscula,
cada
después
de
una
coma
o
punto
etc.
La
poca
cantidad
de
transporte
de
información
oculta
comúnmente
obtenida
en
ocultar
texto
en
texto,
representa
un
gran
problema
para
poder
transportar
un
texto
considerable
por
medio
de
otro
texto,
esto
es
debido
a
que
a
pesar
de
poder
cambiar
algunos
bits
que
conformen
un
segmento
de
información
por
otros
bits
que
representen
otra
información
y
que
con
este
cambio
no
se
note
un
cambio
visual
considerable
en
multimedios
(Comúnmente
conocido
como
LSB
‐
“Less
Significant
Bit”),
el
caso
de
bits
en
texto
es
totalmente
diferente
ya
que
al
cambiar
un
bit
de
algún
carácter
lo
convierte
en
otro
y
genera
una
gran
diferencia
y
tentativamente
puede
llegar
a
considerarse
posteriormente
ante
la
vista
de
alguien
mas
como
un
criptograma.
Al
complicarse
un
cambio
LSB
en
un
texto
y
descartarlo
para
considerar
letras
a
partir
de
referencias,
donde
estas
se
pueden
ser
tomadas
cada
determinada
distancia
entre
textos,
resulta
en
requerir
gran
cantidad
de
texto
para
trasportar
texto
de
tamaños
pequeños,
ejemplo
de
ello
puede
ser
el
tomar
solo
letras
después
de
puntos
o
comas
por
ejemplo
hasta
formar
una
oración
con
sentido.
Actualmente
se
han
desarrollado
mejores
y
mas
completos
interpretes
de
formatos
electrónicos
que
cuentan
con
grandes
capacidades
de
impresión
en
papel
como
en
pantalla
y
dispositivos
de
impresión,
estos
programas
permiten
gran
control
y
conservación
del
formato
que
se
diseñe
en
determinado
programa
para
poder
pórtalo
a
otros
dispositivos
o
equipos
compatibles
y
finalmente
visualizarlo
de
la
misma
manera
en
que
se
han
guardado,
ejemplo
de
estos
programas
son
todos
aquellas
13
aplicaciones
de
procesamiento
de
texto,
calculo
o
presentaciones
en
pantalla,
ademas
de
estos
existen
también
sintaxis
y
lenguajes
completos
de
programación
como
el
XML
y
el
PostScript,
el
cual
posee
una
versatibilidad
de
usos
y
de
sintaxis
a
manera
de
alcanzar
una
impresión
en
pantalla
o
en
papel
muy
personalizada
y
completa
conforme
a
textos
y
vectores
conservando
esta
presentación
en
diferentes
sistemas
operativos
bajo
un
estándar
de
representación.
En
así
que
en
este
trabajo
aprovecharemos
la
potencia
de
generación
de
impresiones
del
PostScript
para
poder
personalizar
un
texto
a
manera
de
que
porte
otro
de
gran
cantidad
en
texto
comparada
con
el
texto
inicial,
hasta
medidas
cercanas
a
la
misma
cantidad
de
información
del
texto
portador,
debido
a
la
manera
en
la
que
se
interpretarán
los
datos
de
un
texto
que
se
dese
ocultar
en
el
documento
electrónico
de
PostScript.
Lo
anterior
nos
brinda
la
oportunidad
de
ofertar
una
opción
mas
completa
a
la
mayoría
de
las
aplicaciones
de
Esteganografía
con
formatos
de
documentos
de
texto
electrónicos
que
sean
portadores
de
alguna
información
adicional
oculta.
DELIMITACIÓN
El
manejo
de
texto
como
tal
para
poder
ocultar
otro
texto,
ocasiona
generalmente
textos
portadores
de
gran
tamaño,
esto
debido
a
las
técnicas
esteganograficas
que
se
apliquen
a
la
hora
de
ocultar
y
recuperar
dicha
información,
la
esteganografía
presenta
mucha
flexibilidad
y
esta
es
generada
por
las
formas
en
que
las
tome
quien
las
aplique,
es
decir
lejos
de
ser
estrictamente
una
ciencia,
puede
perfilarse
como
un
arte,
gracias
a
que
puede
ser
tan
variante
como
el
creador
entienda
y
personalice
un
método
esteganografico.
La
forma
que
usaremos
para
esteganografíar
un
texto
plano
se
basa
en
personalizar
distancias
entre
caracteres
dentro
de
un
documento
electrónico
de
PostScript,
y
es
en
las
variaciones
de
estos
espacios
en
las
que
se
ocultara
información
aprovechando
que
estas
diferencias
tan
pequeñas
son
imperceptibles
al
ojo
humano
dado
que
entre
los
espacios
predeterminados
y
los
nuevos
calculados
para
los
caracteres
del
texto,
no
debe
existir
una
diferencia
visible.
Tal
es
que
al
aplicarla
nos
generara
ciertas
opciones
como
poder
modificar
el
aspecto
visual
o
conservarlo
como
esta
en
el
archivo
de
texto
fuente,
para
que
dentro
de
estos
cambios
y
aspectos
finales,
ademas
de
adherir
texto
oculto
el
adicionar
un
formato
visual
mas
completo,
el
cual
será
justificar
el
texto
y
especificar
algunas
distancias
de
margenes,
espacios
entre
líneas
y
tamaño
de
fuente
para
el
documento
electrónico.
14
En
este
trabajo,
se
usarán
documentos
en
archivos
de
texto
plano,
estos
serán
transportados
al
formato
de
impresión
en
el
lenguaje
PostScript
cambiando
su
aspecto
de
texto
plano
en
archivo
TXT
a
un
formato
justificado
y
espaciado
con
una
fuente
Arial
en
el
lenguaje
PostScript;
se
ha
escogido
este
procedimiento
para
ofrecer
una
transformación
del
formato
de
la
información
que
se
tiene,
sin
cambiar
el
sentido
de
la
lectura
y
en
este
proceso
incluir
otra
información
y
conservar
la
lectura
idéntica
entre
el
archivo
original
fuente
y
el
generado
en
PostScript,
lo
que
finalmente
entrega
un
procedimiento
de
esteganografía
de
texto
para
otro
texto
con
gran
capacidad
de
transporte
para
el
mensaje
oculto.
Los
archivos
de
texto
que
tomaremos
serán
texto
planos,
es
decir
que
deben
de
tener
el
texto
de
manera
simple
y
una
codificación
Occidental
(Mac
OS
Roman).
ESQUEMA
El
trabajo
es
descrito
en
tres
bloques,
como
sigue:
• Lenguaje
• Medios
• Capacidades
Desarollo
• Conjunto
de
Pruebas
• Modi~icaciones
• MOS
• Sintaxis
P.S.
• Ocultamiento
• Recuperación
Esteganogra~ia
Pruebas
Fig.
1.
Bloques
de
Desarrollo
15
Cada
bloque
es
una
serie
de
propuestas,
delimitaciones
y
mejoras
a
ideas
iniciales.
El
primer
bloque
se
conforma
de
la
selección
del
lenguaje
a
utilizar
para
generar
el
archivo
que
tendrá
la
información
oculta
que
será
el
PostScript,
así
como
los
medios
que
se
utilizaran
para
formar
una
estructura
de
transporte
de
información
oculta,
también
se
selecciona
el
lenguaje
de
desarrollo,
tipos
de
archivos
a
tomar,
en
el
caso
archivos
de
texto.
Para
el
segundo
bloque
de
desarrollo,
se
escoge
la
sintaxis
que
nos
convenga
para
poder
elaborar
un
archivo
PostScript.
tanto
como
se
desarrollan
los
dos
módulos
principales
del
proyecto,
siendo
el
primero
un
programa
sobre
la
línea
de
comando
que
lleve
a
acabo
el
ocultamiento
de
la
información
de
un
archivo
de
texto
sobre
otro
texto
presentado
en
formato
de
PostScript,
tanto
como
el
desarrollo
al
modulo
que
nos
ayudara
a
poder
recuperar
un
mensaje
oculto
desde
un
archivo
PostScript
previamente
generado.
Finalmente
la
parte
de
generación
de
pruebas
tanto
impresas
como
en
pantalla
que
nos
permite
saber
en
base
a
una
muestra
de
población
que
se
le
aplica
una
serie
preguntas
a
responder
en
base
a
tres
pares
de
documentos
impresos
diferentes,
donde
cada
par
esta
conformado
de
un
archivo
que
posee
información
oculta
y
de
otro
que
no
la
tiene,
estas
pruebas
son
mayormente
conocidas
como
pruebas
MOS
y
describen
el
nivel
de
aceptación
de
un
evento
propuesto
a
la
sociedad,
en
este
caso
de
que
no
existe
diferencia
entre
las
impresiones
cuando
en
verdad
la
hay,
pero
también
no
hay
percepción
de
la
existencia
de
información
oculta,
que
es
uno
de
los
objetivos
del
proyecto.
ESTADO
DEL
ARTE
El
campo
de
la
esteganografía,
actualmente;
se
perfila
hacia
el
uso
de
medios
electrónicos,
en
la
mayoría
de
los
casos,
esto
por
la
popularidad
del
medio
y
la
facilidad
de
difusión
tanto
como
la
flexibilidad
que
estos
medios
electrónicos
informáticos
pueden
llegar
a
proporcionar
o
en
todo
caso
según
la
creatividad
del
autor
para
ocultar
con
ellos
información
o
datos.
Actualmente
existen
mas
del
centenar
de
aplicaciones
de
esteganografía
para
trabajar
de
forma
informática,
es
decir
por
medio
de
programas
para
equipo
de
computo,
independiente
de
lo
que
pueda
existir
en
otros
medios
como
papel,
perforaciones
o
tintas
especiales.
El
uso
de
medios
electrónicos
para
el
ocultamiento
y/o
protección
de
la
información,
tiene
actualmente
gran
auge
cuando
estos
medios
son
sustanciosos
en
sus
capacidades
y
características
propias
de
uso
y
manipulación,
es
decir
estos
recursos
son
muy
populares
y
utilizables
generalmente
por
tener
un
¨tamaño¨
(Informaticamente
hablando)
considerable,
por
ejemplo
videos,
imágenes
sonidos
y
formatos
de
impresión.
16
En
base
a
lo
anterior
y
requiriendo
conocer
la
oferta
actual,
se
tiene
la
siguiente
recopilación
en
el
estudio
del
arte
relacionado
con
los
programas
hablando
de
Software
tengan
un
objetivo
de
esteganografía.
Steganopic
0.1
(Windows)
Programa
de
esteganografía,
que
esconde
textos
en
imágenes,
sin
cambiar
su
apariencia.
Soporta
solamente
el
formato
GIF.
Cloak
7.0
(Windows)
Programa
de
esteganografía
que
se
utiliza
para
encriptar
y
ocultar
archivos
dentro
de
imágenes
BMP.
Utiliza
métodos
avanzados
para
proteger
los
archivos.
Incluye
los
algoritmos
de
encriptación
Cloak−128,
Blowfish
y
Mercury.
CryptoMX
1.1
(Win
Mac
Lin)
Colección
de
herramientas
de
encriptación,
esteganografía
y
conversión.
Trabaja
en
conjunto
con
el
navegador
IE,
Netscape,
Mozilla
y
browsers
Javascript.
Esta
realiza
esteganografía
de
texto
con
texto
pero
genera
un
texto
aleatorio
del
que
extrae
posteriormente
la
información.
Dound’s
Steganography
1.6
(Windows)
Permite
al
usuario,
con
una
simple
clave,
codificar
y
descodificar
mensajes
desde,
o
hacia,
un
archivo
de
imagen.
Es
muy
fácil
y
prácticamente
no
se
ve
la
diferencia
entre
la
imagen
original
y
la
codificada.
Tiene
una
imagen
simple
para
probar.
Hip
2.0
(Windows)
Es
un
programa
que
te
permite
esconder
archivos
dentro
de
bitmaps,
utilizando
una
contraseña.
Da
la
impresión
de
que
las
figuras
son
normales.
UnderMP3Cover
1.1
(Linux)
Herramienta
de
esteganografía
en
archivos
.mp3,
que
permite
escribir
y
leer
mensajes
escondidos
dentro
de
archivos
con
esta
extensión,
sin
crear
ninguna
diferencia
en
el
sonido.
17
Hide
In
Picture
2.1
(Windows)
Hide
In
Picture
(HIP)
es
un
programa
de
esteganografía.
Permite
"esconder"
cualquier
tipo
de
archivo
adentro
de
una
imagen
bitmap
(soporta
GIF
y
BMP).
La
imagen
luce
como
una
foto
normal,
así
otra
persona
no
puede
sospechar
que
contiene
datos
ocultos.
S−Tools
(Windows)
Herramienta
que
permite
guardar
texto
dentro
de
imágenes.
Wodax
1.2
(Windows)
Permite
ocultar
ficheros
de
texto
plano
en
imágenes
PNG
utilizando
la
técnica
"esteganográfica"
de
Inserción
en
el
Bit
Menos
Significativo"
(aunque
realmente
usaba
el
par
de
bits
menos
significativos)
Absolute
Chaos
3.8
(Windows)
Permite
encriptar
cualquier
archivo
o
carpeta
de
la
computadora
y
posteriormente
ocultarlo
en
un
fichero
gif,
doc,
rtf...
o
cualquier
otro.
Hide
In
Picture
2.1
(Windows)
Permite
"esconder"
cualquier
tipo
de
archivo
adentro
de
una
imagen
bitmap
(soporta
GIF
y
BMP).
La
imagen
luce
como
una
foto
normal.
MP3Stego
(Windows,
Linux)
MP3Stego,
es
una
herramienta
que
esconde
datos
en
archivos
MP3.
El
procedimiento
consiste
en
tener
un
archivo
de
texto
con
uno
.WAV,
para
ser
trasformado
en
formato
MP3.
El
problema
es
que
para
esconder
datos
de
cualquier
tamaño
se
necesita
un
archivo
de
un
tamaño
proporcional.
Ejemplo:
para
esconder
un
archivo
de
5
bytes,
se
necesita
un
archivo
WAV
de
aprox.627kB.
Como
resultado,
el
tamaño
del
archivo
compreso
en
MP3
fue
57Kb.
Invisible
Secret
4
(Windows)
Codifica
datos
y
archivos
para
mantenerlos
a
salvo
o
para
transferirlos
de
forma
segura
a
través
de
Internet,
sino
que
también
los
esconde
en
lugares
que
superficialmente
parecen
totalmente
inocentes,
como
archivos
de
imagenes,
de
sonidos
o
paginas
Web.
18
InvisibleInk
(Windows)
InvisibleInk
es
un
programa
de
esteganografía
intuitivo
codificado
en
C#
que
coloca
texto
dentro
de
un
archivo
de
imagen
.bmp.
El
texto
puede
se
fácilmente
encriptado/desencriptado
utilizando
el
algoritmo
Rijndael
con
una
clave
de
256
bytes
generada
con
la
función
sha256.
Steganography
(Windows)
Steganography
usa
técnicas
de
ocultación
de
datos
digitales
(esteganografía)
para
esconder
ficheros
y
mensajes
dentro
de
otros
ficheros
(portadores)
como
ficheros
de
imagen
o
sonido.
Esto
te
permite
cifrar
información
sensible,
mientras
que
al
mismo
tiempo
la
escondes
en
un
fichero
que
no
parece
sospechoso,
de
forma
que
nadie
sepa
que
hay
información
cifrada.
Hermetic
Stego
(Windows)
Hermetic
Stego
es
un
programa
esteganografico
que
permite
cifrar
y
esconder
un
archivo
de
cualquier
tamaño
entre
uno
o
más
archivos
de
imagen
BMP,
con
o
sin
el
uso
de
una
clave
stego/ciframiento,
de
manera
que
la
presencia
del
archivo
es
indetectable,
aún
para
programas
forensicos
que
utilizan
métodos
estadísticos,
y
si
se
utiliza
una
clave
stego
de
un
usuario
especifico,
entonces
el
archivo
solo
puede
ser
extraído
por
alguien,
usando
el
programa,
que
conoce
la
clave
stego.
BitCrypt
(Windows)
BitCrypt
es
un
original
codificador
esteganografico
para
la
comunidad
de
Inteligencia
y
otros
por
el
estilo.
El
programa
le
permite
al
usuario
almacenar
cualquier
mensaje
de
texto
de
manera
cifrada
que
a
su
vez
es
ocultada
dentro
de
una
imagen
especificada
por
el
usuario.
El
texto
es
codificado
con
uno
de
los
algoritmos
de
cifrado
más
robustos
con
el
objeto
de
mejorar
el
nivel
de
seguridad.
Bon
Kyu
Bon
1.1.3011
(Windows)
Permite
ocultar
un
fichero
o
mensaje
dentro
de
otro
archivo.
Con
Bon
Kyu
Bon
se
puede
ocultar
un
documento
importante
o
un
mensaje
secreto
dentro
de
una
inocente
fotografía.
Sólo
se
podrá
descubrir
el
mensaje
o
documento
con
la
clave
o
fichero
llave
correctos.
Bon
Kyu
Bon
soporta
los
siguientes
formatos:
DLL,
EXE,
IL,
BMP,
TIF,
TIFF,
PNG,
GIF,
WAV,
MID
19
SteganoG
1.21
(Windows)
Permite
ocultar
toda
clase
de
ficheros
tras
una
imagen
digital.
Así,
cualquiera
que
abra
el
documento
cifrado
verá
una
inocente
fotografía,
aunque
detrás
se
esconderá
un
documento
secreto.
SteganoG
es
muy
fácil
de
utilizar.
Sólo
se
escoge
la
imagen‐
señuelo
y
el
archivo
a
ocultar.
Además,
cuando
se
configure
la
contraseña
indicará
si
es
suficientemente
segura.
SteganoG
soporta
los
siguientes
formatos:
RAW,
BMP,
DIB
PicCrypt
0.3
(Windows)
Es
una
herramienta
de
cifrado
y
protección
de
ficheros
mediante
esteganografía,
en
este
caso
usando
imágenes.
Se
selecciona
el
tamaño
de
la
imagen,
el
archivo
a
esconder
dentro,
una
contraseña
si
desea
aumentar
todavía
más
la
seguridad,
y
listo.
PicCrypt
es
muy
sencillo
y
no
necesita
configurar
nada.
Lamentablemente,
para
recuperar
el
archivo
cifrado
se
necesita
usar
PicCrypt.
P2Stego
1.0.0
(Windows)
P2Stego
es
capaz
de
insertar
mensajes
de
texto
en
una
imagen
BMP
de
24
bits.
Sólo
hay
que
elegir
el
fichero,
introducir
una
palabra
clave
y
el
mensaje
en
sí.
Al
pulsar
Hide
message,
P2Stego
producirá
una
copia
exacta
de
la
imagen
original.
Para
descubrir
el
texto
se
tiene
a
disposición
la
pestaña
Reveal,
en
la
se
podrá
revelar
el
contenido
oculto
usando
la
misma
contraseña.
P2Stego
presentará
un
mensaje
de
error
genérico
en
caso
de
introducir
una
clave
errónea
o
usar
una
imagen
no
cifrada.
P2Stego
es
una
aplicación
esteganográfica
con
importantes
limitaciones.
No
se
puede
configurar
y
sólo
permite
insertar
mensajes
en
imágenes
BMP
de
24
bits.
Aún
así,
es
una
prueba
de
concepto
interesante.
P2Stego
soporta
los
siguientes
formatos:
BMP
(24
bits)
Nota
sobre
P2Stego:
Editar
o
convertir
una
imagen
modificada
por
P2Stego
hará
que
se
pierda
el
mensaje
oculto
Xiao
Steganography
2.6.1
(Windows)
Se
elige
la
imagen
o
fichero
de
sonido
donde
se
ocultará
la
información,
se
selecciona
los
ficheros
que
quieres
ocultar
y
ajusta
después
las
opciones
de
configuración
necesarias:
algoritmo
de
encriptación,
contraseña,
etc.
20
El
resultado
es
una
imagen
o
fichero
de
sonido
idéntico
al
original,
sólo
que
en
su
interior
se
oculta
un
mensaje
que
sólo
el
destinatario,
con
Xiao
Steganography
y
sabiendo
la
contraseña
correspondiente,
podrá
descifrar.
Cambios
recientes
en
Xiao
Steganography:
Puede
adjuntar
cualquier
tipo
de
archivo
solo
limitado
por
el
tamaño
de
la
imagen
que
cargara
los
archivos,
agregado
un
modulo
de
seguridad,
Encripta
/
Desencripta
con
algoritmos
RC2,
RC4,
DES,
Triple
DES
,
Triple
Des
112
y
Hashing
MD2,
MD4,
MD5,
SHA
a
través
de
la
protección
de
clave
secreta.
ByteShelter
1
(Windows)
ByteShelter
es
un
sencillo
programa
con
el
que
se
puede
ocultar
un
texto
determinado
dentro
de
un
fichero
de
texto
enriquecido
(RTF).
De
esta
forma,
el
documento
RTF
mantiene
exactamente
el
mismo
aspecto,
antes
y
después
de
incluir
el
texto
oculto.
El
programa
funciona
de
la
siguiente
manera:
Copiar
el
texto
RTF
donde
se
ocultará
el
mensaje
directamente
desde
el
Portapapeles.
Luego
se
escribe
el
mensaje
secreto,
y
se
vuelve
a
guardar
el
texto
RTF
y
finalmente
cópiarlo
de
nuevo
al
Portapapeles.
A
partir
de
ese
momento,
se
puede
incluir
en
un
mensaje
de
correo
electrónico
o
en
un
DOC,
y
el
receptor
deberá
usar
ByteShelter
(y
por
supuesto,
introducir
la
correspondiente
contraseña)
para
poder
acceder
al
mensaje
oculto
en
el
texto
RTF.
Digital
Identity
1.0.16
(Windows)
Digital
Identity
gestiona
contraseñas
manteniéndolas
en
un
lugar
seguro,
a
salvo
de
ojos
indiscretos,
protegidas
mediante
un
nombre
de
usuario
y
contraseña.
Para
mayor
seguridad,
el
programa
tiene
soporte
para
codificación
de
ficheros
y
de
esteganografía.
Puede
codificar
contraseñas
dentro
de
imágenes.
La
imagen
conserva
un
aspecto
totalmente
normal
y
nada
hace
pensar
que
oculta
contraseñas
en
su
interior.
El
programa
permite
tanto
encriptar
como
desencriptar
contraseñas
dentro
de
imágenes.
También
incluye
utilidades
de
generación
de
claves,
control
de
su
fecha
de
caducidad
y
evaluación
de
su
nivel
de
seguridad.
21
HIP
(Hide
In
Picture)
2.1
(Windows)
Oculta
un
fichero
dentro
de
una
imagen
en
formato
BMP,
de
forma
que
pase
totalmente
desapercibida.
Se
puede
ocultar
cualquier
tipo
de
fichero,
y
la
imagen
no
se
altera
en
absoluto,
de
forma
que
nadie
sospechará
que
ese
inocente
gráfico
BMP
oculta
un
fichero
secreto
en
su
interior.
Los
datos
quedan
protegidos
mediante
contraseña,
y
puedes
elegir
entre
dos
algoritmos
de
encriptación.
Secure
Share
1.0
(Windows)
permite
"esconder"
ficheros
cifrados
dentro
de
una
imagen,
que
sólo
se
pueden
descodificar
mediante
el
correspondiente
programa.
El
programa
utiliza
el
algoritmo
de
encriptación
Blowfish
para
codificar
el
archivo,
y
después
lo
oculta
dentro
de
un
gráfico
GIF.
La
imagen
tiene
un
aspecto
totalmente
normal
y
no
se
diferencia
en
nada
de
un
GIF
que
no
tenga
información
en
su
interior.
El
archivo
además
se
puede
proteger
mediante
contraseña.
Después
sólo
tienes
que
enviar
el
archivo
por
e‐mail,
FTP
o
como
quieras,
con
la
seguridad
de
que
nadie
podrá
leer
la
información
codificada
en
el
mismo.
Eso
sí,
el
destinatario
del
mensaje
debe
tener
Secure
Share
para
poder
descifrar
el
GIF.
StegHide
(Windows,
Linux)
Steghide
es
un
programa
de
estenografía
que
permite
ocultar
datos
en
varios
tipos
de
imagen
y
archivos
de
audio.
Este
Programa
esta
liberado
bajo
la
licencia
GPL
por
lo
que
se
tiene
acceso
al
código
fuente
y
dispone
de
versiones
para
Windows
y
GNU/Linux.
AdaStegano
(Windows,
Linux)
AdaStegano
permite
ocultar
cualquier
tipo
de
fichero
en
imágenes
bitmap
de
24bpp,
de
forma
que
para
una
tercera
persona
no
sepa
que
esa
imagen
contiene
otro
archivo.
A
partir
de
una
contraseña
definida
por
el
usuario,
se
ocultan
los
datos
en
un
orden
aleatorio;
sin
esa
contraseña,
es
casi
imposible
siquiera
“ver”
que
hay
un
fichero
oculto
en
su
interior.
Este
software
esta
programado
enteramente
en
el
lenguaje
Ada95
y
liberado
bajo
licencia
GPL,
por
lo
que
se
puede
bajar
también
su
código
fuente
y
funciona
para
GNU
Linux
y
MS
Windows.
A
diferencia
del
StegHide,
el
AdaSteganos
cuenta
con
una
interfase
gráfica
y
esta
totalmente
en
español.
22
CryptArkan
(Windows)
La
principal
característica
de
CryptArkan
es
ocultar
archivos
cifrados
dentro
de
archivos
de
audio
wav
con
compresión
PCM
de
16
bits.
Los
archivos
ocultos
Irán
protegidos
mediante
contraseña.
Ademas
de
los
archivos
de
audio,
es
posible
ocultar
y
cifrar
texto
dentro
de
una
imagen
bmp
como
la
mayor
parte
de
programas
de
esteganografía.
Xidie
Security
Suite
(Windows)
Xidie
Security
Suite
es
una
de
las
aplicaciones
lideres
en
cifrado
y
esteganografía
e
incluye
funcionalidades
como:
compresión
de
archivos
(incluyendo
el
formato
Zip),
cifrado,
esteganografía
con
40
tipos
de
portadores,
borrado
seguro
de
archivos
y
otros
componentes
que
le
ayudan
a
proteger
los
archivos
y
carpetas
del
PC
y
almacenarlos
de
forma
segura.
Puede
proteger
un
archivo
o
múltiples
archivos
con
solo
un
clic,
directamente
desde
el
Explorador
de
archivos
de
Windows.
OutGuess
(Unix
Linux)
Permite
la
inserción
de
información
oculta
en
los
bits
de
redundancia
de
fuentes
de
datos.
La
naturaleza
de
la
fuente
de
datos
es
irrelevante
para
el
núcleo
de
OutGuess.
El
programa
se
basa
en
los
datos
de
controladores
específicos
que
va
a
extraer
bits
de
redundancia
y
escribir
de
nuevo
después
de
la
modificación.
En
esta
versión
el
PNM
y
formatos
de
imagen
JPEG
son
compatibles.
En
los
siguientes
párrafos,
las
imágenes
se
utiliza
como
ejemplo
concreto
de
los
objetos
de
datos,
aunque
OutGuess
puede
utilizar
cualquier
tipo
de
datos,
siempre
que
cuenten
con
un
controlador.
Camera
/
Shy
(Windows)
Automáticamente
busca
y
ofrece
contenido
descodificado
directamente
desde
la
Web.
Es
un
stand‐alone,
Internet
Explorer,
basada
en
el
navegador
que
no
deja
rastro
en
el
sistema
del
usuario
y
ha
mejorado
la
seguridad.
JPHIDE
y
JPSEEK
(Windows)
Permiten
ocultar
un
archivo
en
una
imagen
jpeg.
El
objetivo
de
diseño
no
era
simplemente
ocultar
un
archivo,
sino
de
hacerlo
de
tal
manera
que
es
imposible
probar
que
el
archivo
de
host
contiene
un
archivo
oculto.
Dada
una
imagen
visual
típica,
una
tasa
de
inserción
baja
(menos
del
5%)
y
la
ausencia
del
archivo
original,
no
es
posible
concluir
con
certeza
que
vale
la
pena
que
el
archivo
de
host
contiene
datos
insertados.
Como
el
porcentaje
de
inserción
aumenta
la
naturaleza
estadística
de
los
coeficientes
de
jpeg
difiere
de
"normal"
en
la
medida
en
que
aumenta
la
sospecha.
Por
encima
de
15%
de
los
efectos
comienzan
a
ser
visibles
a
simple
vista.
Por
supuesto,
23
algunas
imágenes
son
mucho
mejores
que
otros
cuando
se
utiliza
un
archivo
de
host
‐
un
montón
de
detalle
es
bueno.
Un
cielo
azul
sin
nubes
en
un
paraíso
de
esquí
cubierta
de
nieve
es
malo.
Una
cascada
en
un
bosque
es
probablemente
ideal.
Hydan
(Unix
Linux
Windows)
Oculta
un
mensaje
en
un
ejecutable.
Se
explota
la
redundancia
en
la
instrucción
de
la
i386
establecidos
por
la
definición
de
conjuntos
de
instrucciones
funcionalmente
equivalentes.
A
continuación,
codifica
la
información
en
código
de
máquina,
utilizando
las
instrucciones
de
cada
juego.
El
archivo
ejecutable
se
mantiene
sin
cambios.
El
mensaje
es
cifrado
Blowfish
con
una
frase
de
contraseña
proporcionada
por
el
usuario
antes
de
ser
incorporados.
Según
el
campo
observado
en
Software
para
la
esteganografía,
podemos
observar
como
la
mayoría
de
lo
programas,
independientemente
de
la
plataforma
en
que
se
estén
ejecutando,
prefieren
utilizar
medios
para
portar
información
oculta,
de
gran
capacidad
en
relación
a
su
contenido
y
tamaño
informático;
esto
debido
a
la
facilidad
que
esta
cantidad
de
información
ofrece
para
poder
ser
reemplazada
sin
que
se
note
un
diferencia
considerablemente
visible
en
el
resultado
final.
Lo
anterior
nos
dice
sin
duda
alguna
que
la
popularidad
de
ocultar
información
en
imágenes
o
sonido
y
seguramente
en
video
mas
adelante
por
lo
que
este
perfila
en
e
su
cantidad
de
información
se
desenvuelven
y
crecen
con
mayor
velocidad
que
otros
medios
de
menor
cantidad
de
información,
por
lo
que
en
un
futuro
seria
mas
probable
tomar
en
cuenta
para
sospechar
estos
medios
que
los
recursos
mas
livianos
en
un
tamaño
informático,
por
ejemplo
textos
o
formatos
de
impresión
electrónica.
Pero
con
base
a
este
estudio
del
arte
nos
deja
sin
duda
de
que
el
recurso
necesario
para
poder
ocultar
información
termina
siendo
el
recurso
necesario
para
camuflar
información,
así
que
es
siempre
necesario
incrementar
o
tener
gran
cantidad
de
información
para
dentro
de
ella
colocar
otra
determina
información
que
parezca
perteneciente
a
la
propia
portadora,
sin
embargo
y
obviamente
sin
perder
el
objetivo
de
la
esteganografía,
esta
ultima
sea
un
mensaje
o
información
oculta.
En
base
a
las
premisas
que
nos
ofrecen
los
programas
y
que
la
elaboración
de
estos
en
su
gran
mayoría
se
enfocan
a
el
trabajo
de
información
oculta
con
ayuda
de
recursos
multimedia
de
gran
capacidad,
el
reto
que
se
tiene
es
ocultar
información
con
menor
cantidad
de
información,
así
este
desarrollo
toma
el
reto
de
ocultar
texto
pero
en
otro
texto
y
respetando
la
forma
de
tener
un
incremento
en
el
medio
portador
que
ocultara
la
información;
este
medio
serán
los
archivos
de
impresión
electrónica,
conocidos
como
archivos
PostScript.
24
CAPITULO
2
POSTSCRIPT
El
PostScript,
es
un
lenguaje
de
programación
para
presentar
información
en
texto
y/o
vectores
para,
estos
últimos
para
generar
imagenes
en
la
computadora
y
en
impresoras
que
soporten
este
lenguaje,
tal
es
que
este
lenguaje
tiene
ya
una
larga
trayectoria
de
uso
y
desarrollo;
ha
tenido
ya
varias
versiones
y
con
ellas
diferentes
y
mejores
usos
como
también
aplicaciones,
por
ejemplo,
en
las
primeras
versiones
no
es
posible
representar
imágenes
como
en
las
ultimas
versiones,
sin
embargo
cabe
mencionar
que
en
este
trabajo
no
nos
enfocaremos
al
tratamiento
de
imágenes.
Es
importante
de
tal
manera
conocer
que
la
principal
aplicación
del
PostScript
es
describir
la
apariencia
de
texto,
formas
graficas
e
imagenes.
Esta
descripción
de
alto
nivel
sobre
texto
e
imagen
es
independiente
del
dispositivo
grafico
a
usar
(pantalla
grafica
o
impresora).
Para
lograr
las
características
anteriores
entre
otras,
el
lenguaje
PostScript
hace
uso
de
un
“interprete”,
quien
tendrá
el
papel
de
cambiar
las
líneas
de
código
por
una
representación
en
la
pantalla
involucrando
textos
y/o
imágenes.
PostScript
puede
ser
visto
desde
los
siguientes
puntos
de
vista:
•
•
•
•
Un
lenguaje
de
programación
de
propósito
general
con
primitivas
graficas
incorporadas.
Un
lenguaje
de
descripción
de
pagina
con
cualidades
de
programación.
Un
sistema
interactivo
para
controlar
dispositivos
de
salida
raster
(pantallas
e
impresoras)
Un
formato
para
intercambio
El
lenguaje
PostScript
(PS)
puede
interactuar
con
Dispositivos
de
Salida
Raster
(DSR)
tales
como
impresoras
láser,
matriz
de
punto,
de
inyección
de
tinta
y
todo
tipo
de
pantallas.
Una
imagen
impresa
o
desplegada
a
un
DSR
es
un
arreglo
rectangular
de
puntos
llamados
pixeles
que
pueden
ser
direccionados
individualmente.
Por
ejemplo
en
DSR
blanco
y
negro
cada
pixel
puede
ser
blanco
o
negro.
En
otros
DSR
mas
avanzados
estos
pixeles
pueden
ser
tonalidades
de
grises
o
colores.
Con
esta
técnica
se
pueden
reproducir
complejas
imagenes
o
texto
dependiendo
de
la
resolución
del
DSR.
25
Lenguajes
de
Descripción
de
Pagina
Teóricamente
o
comúnmente
se
podría
pensar
que
cualquier
aplicación
(como
un
procesador
de
texto
por
ejemplo)
podría
hacer
una
descripción
de
pagina
como
un
arreglo
de
paginas,
cada
una
de
estas
siendo
un
arreglo
de
pixeles.
Sin
embargo
una
descripción
de
este
tipo
seria
dependiente
del
dispositivo
y
por
lo
tanto
enorme
para
documentos
grandes.
Un
lenguaje
de
descripción
de
pagina
debe
ser
suficientemente
compacto
para
almacenamiento
y
transmisión,
ademas
de
ser
independiente
del
dispositivo.
Estas
características
de
portabilidad
e
independencia
para
un
archivo
a
un
dispositivo
se
pueden
lograr
si
el
lenguaje
logra
describir
las
paginas
en
términos
de
entidades
graficas
abstractas
de
alto
nivel
en
lugar
de
un
arreglo
de
pixeles.
Es
en
el
DSR
donde
se
genera
el
arreglo
de
pixeles
a
través
del
proceso
llamado
“Scan
Conversion”,
Este
proceso
consiste
en
que
dada
una
descripción
PS
en
este
caso
para
la
entidad
grafica,
se
determinan
que
pixeles
se
deben
ajustar
y
que
valor
se
les
debe
asignar
para
encontrar
la
mejor
representación
posible
de
la
entidad
a
la
resolución
del
DSR.
Estructura
del
Lenguaje
Una
descripción
de
pagina
PS
bien
estructurada
consiste
en
un
prologo
y
un
script.
El
prologo
es
un
conjunto
de
procedimientos
a
usar
y
se
acostumbra
a
ponerlo
en
el
comienzo
del
archivo.
El
script
es
la
descripción
de
los
elementos
de
las
paginas
con
ayuda
de
los
procedimientos
del
prologo.
Esto
ayuda
a
que
la
descripción
de
la
pagina
sea
mas
eficiente
y
compacta.
Por
ejemplo
en
el
prologo
se
puede
definir:
/ms {moveto show} bind ref
Y
en
el
script
se
puede
llamar
a
este
procedimiento
de
la
siguiente
forma:
(texto cualquiera aquí) 100 200 ms
Así
el
script
de
un
documento
a
imprimir
por
ejemplo,
consiste
típicamente
de
una
secuencia
de
paginas
separadas.
La
descripción
de
cada
pagina
puede
usar
los
procedimientos
del
prologo
pero
debe
ser
independiente
de
las
demás
paginas
del
script.
26
Programación
en
PostScript
PostScript,
lejos
de
ser
solo
una
estructura
de
representación
de
impresiones
en
pantalla
o
impresoras
de
texto
y
de
imágenes,
es
un
muy
completo
lenguaje
de
programación
que
nos
permite
llevar
acabo
diferentes
tareas,
tales
como
calculo
de
operaciones
matemáticas
y
resolución
de
problemas
computables,
tal
es
el
canso
entonces
que
PostScript
usa
notación
postfija.
En
una
operación
los
operandos
van
después
de
los
operadores.
Ej: “2 3 add”.
El
interprete
PS
manipula
entidades
llamados
Objetos
PostScript
(OP).
Algunos
OP
son
datos
(números,
booleanos,
strings)
mientras
que
otros
son
elementos
de
programa
a
ser
ejecutados
(nombres,
operadores
y
procedimientos).
El
interprete
opera
ejecutando
secuencia
de
OP.
El
efecto
de
la
ejecución
de
un
OP
depende
del
tipo
de
este,
sus
atributos
y
su
valor.
Por
ejemplo
la
ejecución
de
un
OP
numero
provoca
que
el
interprete
ponga
una
copia
de
ese
objeto
en
la
pila
de
operandos
para
posterior
seguir
operaciones
postfijas.
La
ejecución
de
un
nombre
provoca
que
el
interprete
busque
su
valor
en
el
diccionario,
lo
obtenga
y
ejecute
ese
valor
asociado.
La
ejecución
de
un
objeto
operador
provoca
que
el
interprete
realice
una
acción
que
posee
incorporada,
tal
como
la
suma
o
el
pintado
de
caracteres
en
memoria.
El
intérprete
PS
consume
un
programa
mediante
la
ejecución
de
cada
OP
que
encuentra.
No
es
necesario
por
tanto
compilar
o
interpretar
el
programa
entero
de
una
vez
para
hacer
algo.
Existen
tres
codificaciones
para
programas
PS:
ASCII,
binary
token
y
secuencia
de
objetos
binarios.
ASCII
es
la
codificación
mas
usada
y
recomendada.
En
la
codificación
ASCII
los
espacios
en
blanco
separan
una
construcción
sintáctica
de
otra.
Uno
o
mas
espacios
son
tratados
como
si
fueran
uno
solo.
Los
caracteres
tratados
como
espacios
son
los
siguientes:
Octal
000
011
012
014
015
040
Hex
00
09
0A
0C
0D
20
Decimal
0
9
10
12
13
32
Nombre
Nulo
(nul)
Tab
(tab)
Line‐feed
(LF)
Form‐feed
(FF)
Carriage‐return
(CR)
Space
(SP)
Fig.
2.
Tabla
de
Codificaciones
27
Los
caracteres
CR
y
LF
son
también
llamados
caracteres
newline.
Un
CR
seguido
inmediatamente
por
un
LF
son
tratados
juntos
como
un
solo
newline.
Los
caracteres
(,),<,>,[,],{,},/,
y
%
son
especiales.
Ellos
delimitan
entidades
sintácticas
tales
como
strings,
procedimientos,
nombres
literales
y
comentarios,
sin
embargo
cabe
señalar
que
por
ello
al
enviarlos
a
pantalla
reciben
un
trato
especial.
Un
comentario
en
PS
se
forma
desde
un
%
hasta
el
siguiente
newline
no
importando
la
existencia
de
cualquier
carácter
de
por
medio.
Números
Los
números
en
PS
pueden
ser:
•
•
•
Enteros
con
signo:
123,
‐98,
43445,
0,
+17
Reales:
‐0.002,
‐.01,
123.6e10.
1E‐5,
0.0
y
Números
con
base
(radix
numbers):
8#1777,
16#FFFE,
2#1000
Si
un
entero
excede
el
limite
de
implementación
para
ese
tipo
de
dato
entonces
es
convertido
a
real.
Si
un
real
excede
su
limite
entonces
un
error
de
“limitcheck”
ocurre.
Los
mismo
anterior
sucede
para
los
radix
numbers.
Strings
Hay
3
convenciones
para
definir
strings:
•
•
•
Como
texto
literal
encerrado
entre
(
y
)
Como
dato
codificado
hexadecimal
encerrado
entre
<
y
>
Como
dato
codificado
ASCII
base‐85
encerrado
entre
<~
y
~>
(PS2)
Dentro
de
un
string
el
“backslash”
\
se
usa
como
carácter
de
escape
para
incluir
caracteres
especiales
tales
como
:
\n,
\r,
\t,
\b,
\f,
\\,
\(,
\),
\ddd.
Este
ultimo
es
código
octal
del
carácter
y
sirve
para
poner
caracteres
especiales
como
ñ
o
á,
ó,
etc.
28
Nombres
Toda
construcción
sintáctica
compuesta
de
caracteres
regulares
y
que
no
puede
ser
interpretado
como
numero
es
tratado
como
un
objeto
nombre
o
un
nombre
ejecutable.
Cualquier
carácter
excepto
delimitadores
o
espacios
pueden
formar
parte
de
un
nombre.
Cuando
inmediatamente
delante
del
nombre
hay
un
/
entonces
este
es
un
nombre
literal,
en
caso
contrario
es
un
nombre
ejecutable.
Arreglos
Los
caracteres
“[“
y
“]”
delimitan
un
arreglo.
Por
ejemplo:
“[123
/abc
(xyz)]”
es
un
objeto
arreglo
que
contiene
el
entero
“123”,
el
nombre
literal
“abc”
y
el
string
“xyz”.
Procedimientos
Los
caracteres
“{“
y
“}”
delimitan
un
arreglo
ejecutable
o
procedimiento.
Por
ejemplo:
“{add
2
div}”.
Un
procedimiento
no
es
ejecutado
de
inmediato,
sino
que
se
pone
en
la
pila
de
operandos
y
se
ejecuta
si
es
explícitamente
invocado.
Ejecución
El
lenguaje
de
programación
PostScript,
como
se
ha
mencionado,
trabaja
con
forme
a
evaluaciones
postfijas,
estas
son
asistidas
de
funcionamientos
en
pilas,
dichas
pilas
son
manipuladas
por
el
interprete
(IPS).
El
IPS
maneja
4
pilas
que
representan
el
estado
de
ejecución
de
un
programa
PS.
•
•
•
•
Pila
de
operandos.
Mantiene
los
objetos
PS
que
son
operandos
para
una
operación
posterior
o
son
el
resultado
de
alguna
operación
llevada
a
cabo.
Esta
pila
puede
es
manipulada
por
el
programa
PS.
Pila
diccionario.
Mantiene
objetos
diccionario.
Esta
pila
también
es
manipulada
por
el
programa
PS.
Pila
de
ejecución.
Mantiene
la
secuencia
de
objetos
ejecutables
a
ejecutar.
Esta
pila
es
manipulada
por
el
IPS,
puede
ser
leída
por
el
programa
PS
pero
no
modificada.
Pila
de
estado
grafico.
La
semántica
de
la
ejecución
difiere
de
un
tipo
de
objeto
a
otro.
Esta
ejecución
puede
ser
inmediata
o
diferida.
29
Por
ejemplo:
“40
60
add
2
div”
1. El
IPS
en
este
caso
carga
en
la
pila
de
operandos
el
valor
entero
40.
2. Se
encuentra
el
entero
60
y
lo
carga
también
en
la
pila
de
operandos.
3. Se
encuentra
“add”,
se
busca
en
la
pila
de
diccionarios
por
este
nombre.
Se
encuentra
en
“systemdict”
y
se
ejecuta
su
acción
incorporada,
la
suma
de
los
dos
últimos
operandos
de
la
pila
de
operandos.
4. Luego
de
llevarse
a
cabo
tal
operación
se
carga
100
en
la
pila
de
operandos
y
se
eliminan
los
operandos
anteriores
5. Luego
el
IPS
carga
2
en
la
pila
de
operandos
y
ejecuta
“div”,
después
de
lo
cual
cargaría
50
en
la
pila
de
operandos.
Esta
ejecución
es
inmediata.
Estructuras
de
control
En
PS,
las
estructuras
de
control
tales
como
condicionales
o
iteraciones
son
llevadas
a
cabo
por
operadores
que
toman
procedimientos
como
operandos.
Por
ejemplo:
a b gt {a} {b} ifelse
1.
2.
3.
4.
El
interprete
encuentra
los
nombre
ejecutables
“a”
y
“b”
y
los
busca
en
la
pila
de
diccionarios.
En
este
caso
se
asumen
números
y
se
ejecutan
cargándolos
en
la
pila
de
operandos.
El
operador
“gt”
saca
los
dos
operandos,
los
compara
y
pone
“true”
en
la
pila
si
el
primero
es
mayor
que
el
segundo
y
“false”
en
cualquier
otro
caso.
Se
encuentran
los
procedimientos
{a}
y
{b}
que
se
ponen
en
la
pila
de
operandos.
El
operador
“ifelse”
toma
tres
operandos,
un
boolean
y
dos
procedimientos.
Se
sacan
estos
tres
operandos
de
la
pila
de
operandos.
Si
el
primer
operando
es
“true”
entonces
se
ejecuta
{a},
en
otro
caso
se
ejecuta
{b}.
El
resultado
de
este
estamento
es
poner
entonces
en
la
pila
de
operandos
el
valor
mayor
entre
“a”
y
“b”,
dado
que
ambos
procedimientos
tienen
aquellos
números
tan
solo
como
cuerpo.
30
Los
operadores
de
control
son:1
•
•
•
•
•
•
if,
ifelse
Ejecuta
un
objeto
incondicionalmente.
for,
repeat,
loop
y
forall
exit:
Escapa
de
un
loop
stop:
Termino
prematuro,
quiebra
toda
secuencia
de
ejecución.
countexecstack,
execstack:
se
usan
para
leer
la
pila
de
ejecución
Ejemplos:
% provocara poner en la pila 4 veces el string “abc” sacando previamente
% los operandos 4 y el procedimiento de la pila
4 {(abc)}repeat
% aquí el tope de la pila termina con el valor 4
8 4 {1 sub} repeat
% equivale al codigo-C: for(i=0; i<=8; i++) proc;
% si el incremento es negativo entonces el <= se cambia por un >=
0 2 8 {proc} for
% lo siguiente pondra los valores 3.0, 2.5, 2.0, 1.5 y 1.0 en la pila
3 -0.5 1 {}for
% en cada iteracion del for el actual valor del contador es puesto en la
pila, así
0 1 4 {add} for
% resultara en un 10 al final.
Entre
las
estructuras
de
control,
pilas
y
demás
prestaciones
que
ofrece
el
lenguaje
de
PostScript
podríamos
detallar
mas
acerca
del
funcionamiento
del
lenguaje,
sin
embargo
dado
que
este
no
es
el
objetivo
de
esta
investigación,
continuaremos
con
las
actividades
relacionadas
al
proyecto.
Todo
lo
concerniente
al
lenguaje
PostScript
que
tenga
relación
con
el
tema
se
desarrollara
en
el
tiempo.
1
PostScript.
Salvador
Ramírez
Flandes,
Ideas
Básicas,
P.
5
31
Por
ahora,
es
importante
saber
que
se
ha
escogido
el
lenguaje
PostScript
para
poder
representar
textos
en
formatos
justificados,
gracias
a
la
posibilidad
de
especificar
con
detalle
las
separaciones
entre
caracteres,
que
es
una
de
las
características
finales
que
se
desea
al
finalizar
un
archivo
PostScript,
objetivo
comentado
anteriormente.
De
tal
forma
que
según
la
oferta
de
las
capacidades
del
PostScript,
nos
permitirá
especificar
con
precisión
la
ubicación
de
cada
uno
de
los
caracteres
de
un
texto
indicado,
de
tal
suerte
que
dentro
de
este
resultado
visible
en
un
archivo
PS
encontremos
de
forma
esteganografiada
a
la
información
que
deseamos
ocultar
o
proteger,
esta
información
debe
de
poder
ser
recuperada
posteriormente
y
esto
se
hará
a
través
de
la
estructura
de
sintaxis
que
se
termine
utilizando
para
armar
el
archivo
PS
con
distancias
modificadas
pero
imperceptibles
en
comparación
a
las
separaciones
entre
caracteres,
que
entre
otras
medidas
que
describen
a
un
carácter
se
conocen
como
métricas.
SELECCIÓN
DEL
LENGUAJE
DE
PROGRAMACIÓN
El
lenguaje
de
programación
para
formar
este
proyecto
se
escoge
con
cuidado
pues
debe
de
tener
un
alto
grado
de
portabilidad
y
rapidez
en
su
ejecución
para
los
trabajos
que
se
le
asignen,
tanto
como
la
habilidad
de
poder
escribir
ficheros
en
el
sistema
de
archivos
donde
se
este
ejecutando,
pues
estas
escrituras
serán
los
archivos
que
buscamos
generar
en
este
trabajo,
es
decir
los
archivos
PS
finales
que
serán
capaces
de
portar
información
protegida
en
con
ayuda
de
la
técnica
esteganografica
dicha.
El
lenguaje
de
programación
que
se
ha
seleccionado
es
el
“C”,
dado
que
este
lenguaje
proporciona
todos
los
elementos
que
requerimos
para
formar
los
archivos
resultantes
PS
y
posteriormente
estos
puedan
ser
desplazados
hacia
otro
programa
o
modulo
que
se
encargue
de
extraer
la
información
que
se
ha
protegido.
SELECCIÓN
DE
MODULOS
A
DESARROLLAR
Dado
que
el
proyecto
marca
elaborar
una
protección
esteganografica
para
ocultar
o
proteger
información
en
forma
de
texto,
esta
debe
de
ser
posible
de
recuperarse
a
partir
de
los
primeros
resultados
que
nos
entregue
la
fase
de
ocultamiento,
de
tal
manera
que
entre
ambos
programas
o
módulos
completen
un
ciclo
para
el
viaje
de
información
de
un
punto
a
otro
pasando
por
un
medio
informático,
pudiendo
ser
memorias
USB,
Correos,
Internet,
etc,
con
esteganografía
para
proteger
y
brindar
confidenciabilidad
a
la
información.
32
Para
alcanzar
a
cumplir
lo
anterior
se
ha
seleccionado
desarrollar
dos
módulos
generales,
estos
han
sido
escogidos
para
cumplir
con
los
anteriores
planteamientos,
el
primero
será
quien
se
encargue
del
proceso
de
ocultar
un
texto
en
otro
texto
resultando
este
ultimo
en
formato
electrónico
PostScript,
para
que
el
segundo
tenga
la
labor
de
extraer
en
relación
este
ultimo
archivo
creado,
la
información
ocultada.
Una
vista
preliminar
del
comportamiento
será:
Fig.
3.
Flujo
de
Esteganografía
Propuesto
Donde
el
archivo
PS
presentará
la
misma
información
que
el
“Archivo
de
Texto”
originalmente
dicho,
solo
que
adicionado
el
formato
de
justificado
y
será
presentado
con
un
formato
y
extensión
PS.
Ahora
en
relación
al
modulo
encargado
de
extraer
la
información
,
este
esta
obligado
a
tomar
los
archivos
que
se
generan
con
el
procedimiento
anterior,
esto
debido
a
la
forma
en
que
esta
estructurado
el
archivo
PS
portador
y
su
sintaxis
interna.
El
detalle
de
cómo
se
extrae
y
almacena
la
información
a
proteger
se
detalla
mas
adelante.
Fig.
4.
Flujo
de
Extracción
Propuesto
La
utilización
de
estos
dos
módulos
es
el
procedimiento
completo
para
poder
proteger
algún
texto,
visualizarlo
y
transportarlo
con
y
diferentes
medios
hasta
extraer
dicha
información
oculta.
Durante
el
Capitulo
3
se
vera
mas
a
detalle
como
es
el
funcionamiento
de
cada
uno
de
los
generadores,
tanto
como
es
que
uno
depende
del
formato
entregado
en
los
archivos
PS
para
realizar
su
función
de
Extracción,
pues
ambos
programas
trabajan
sobre
las
métricas
entre
caracteres
para
ocultar
y
extraer
información.
33
CAPITULO
3
ARCHIVOS
DE
TEXTO
Los
archivos
de
texto
plano
(en
inglés
plain
text)
son
aquellos
que
están
compuestos
únicamente
por
texto
sin
formato,
sólo
caracteres.
Estos
caracteres
se
pueden
codificar
de
distintos
modos
dependiendo
de
la
lengua
usada.
Algunos
de
los
sistemas
de
codificación
más
usados
son:
ASCII,
ISO‐8859‐1
o
Latín‐1,
Unicode,
etc...
Se
les
conoce
también
como
archivos
de
texto
llano,
o
texto
simple,
por
carecer
de
información
destinada
a
generar
formatos
(negritas,
subrayado,
cursivas,
tamaño,
etc.)
y
tipos
de
letra
(por
ejemplo,
Arial,
Times,
Courier,
etc.).
El
término
texto
plano
proviene
de
una
traducción
literal
del
término
inglés
plain
text,
término
que
en
lengua
castellana
significa
texto
simple
o
texto
sencillo.2
En
este
caso
se
están
utilizando
archivos
de
texto
plano,
estos
archivos
están
escritos
en
el
sistema
operativo
donde
se
ha
desarrollado
la
aplicación,
este
sistema
operativo
es
el
OS
X
10.5,
sin
embargo
se
tiene
la
singularidad
de
que
están
en
una
codificación
de
texto
normal
Occidental
MAC
OS
Roman.
Estos
archivos
son
compatibles
en
sistemas
operativos
Linux
y
Windows,
presentando
así
una
gran
portabilidad
al
momento
de
aplicarles
en
el
programas
generador
de
PostScript.
Dentro
de
los
archivos
con
los
que
alimentaremos
al
generador
no
existe
un
formato
establecido,
pues
una
de
las
finalidades
es
proporcionarle
uno,
este
será
el
justificado,
pero
de
este
en
fuera
se
tomara
como
este
conformado
el
archivo
original,
de
tal
manera
que
el
archivo
de
texto
original
debe
presentar
la
información
que
será
la
encargada
de
portar
otra
información
a
proteger
o
ocultar
para
llegar
al
formato
PS.
Se
tiene
contemplado
para
estos
archivos,
tomar
líneas
largas
sin
saltos
de
carro,
para
posteriormente
ajustarlas
en
el
formato
buscado,
sin
embargo
si
se
encuentran
líneas
con
pocas
palabras
y
estas
no
aplican
al
justificado
se
presentaran
como
están
o
si
es
necesario
de
ajustaran.
2
http://www.mitecnologico.com/Main/DefinicionArchivosTextoBinarios
34
ARCHIVOS
POSTCRIPT
PostScript
es
un
"lenguaje
de
descripción
de
página",
es
decir,
es
un
lenguaje
de
programación
que
se
usa
para
decirle
a
una
máquina
destinada
a
imprimir
cómo
y
qué
debe
imprimir.
Un
documento
PostScript,
en
realidad,
es
un
pequeño
programa
que
le
dice
a
una
máquina
qué,
cómo
y
dónde
imprimir,
paso
a
paso.
Los
documentos
PostScript
se
destinan
a
imprimirse
en
aparatos
PostScript,
es
decir,
en
aparatos
que
tienen
un
dispositivo
interno
capaz
de
descifrar
el
código
que
reciben
y
convertirlo
en
simples
puntos
de
impresión.3
PostScript
fue
inventado
y
desarrollado
por
la
firma
californiana
Adobe
hacia
1984.
Apple
lo
adaptó
en
1985
a
sus
impresoras
láser
y
fue
un
rotundo
éxito,
gracias
en
parte
a
una
aplicación
de
diseño
de
páginas
llamada
PageMaker
que
fabricaba
la
compañía
Aldus.
Cuando
una
empresa
de
gran
solvencia
en
las
artes
gráficas,
Linotype,
adoptó
PostScript
el
éxito
quedó
asegurado.
El
hecho
es
que
PostScript
no
es
el
único
Lenguaje
de
Descripción
de
Página
(LDP)
que
existe,
pero
es
el
que
ha
tenido
más
éxito
y
el
que
se
ha
convertido
en
un
estándar
de
las
artes
gráficas.
Los
archivos
PostScript
son
ficheros
que
se
atienen
a
la
estructura
del
lenguaje
PostScript
para,
usualmente,
describir
datos
de
imagen
a
un
dispositivo
de
impresión
"de
calidad".
Todo
fichero
PostScript
tendrá
un
encabezamiento
que
lo
identificará
como
fichero
PostScript:
%!PS­Adobe­3.0
y
terminará
con
una
marca
de
final
de
fichero
del
tipo
%%EOF
,
%EPS
grestore,
%EndPhotoshop
,
o
algo
similar.
Los
ficheros
Postcript
pueden
ser
multipágina
o
de
una
sola
página.
Éstos
últimos
se
suelen
llamar
ficheros
"EPS"
(pronúncialo
"e‐pe‐ése"),
del
inglés
Encapsulated
PostScript,
("PostScript
Encapsulado").
La
diferencia
básica
es
que
los
ficheros
EPS
son
ficheros
que
se
van
a
tratar
como
una
única
imagen
(especialmente
en
otro
programa)
y
que,
por
ello,
contienen
una
delimitación
de
tamaño
(que
va
marcada
mediante
el
uso
de
la
orden
"BoundingBox"
y
la
restricción
de
no
usar
la
de
"showpage").
La
diferencia
entre
los
ficheros
PostScript
a
secas
y
los
ficheros
EPS
es,
pues,
que
son
los
primeros
no
encapsulados
y
pueden
ser
multipágina.
3
http://www.gusgsm.com/que_es_el_lenguaje_postscript
35
Los
ficheros
PostScript
(del
tipo
que
sean)
pueden
contener,
además
de
masas
de
texto,
información
gráfica
de
dos
tipos
principales:
Objetos
vectoriales
y
mapas
de
imágenes.
En
claro:
Dibujos
de
programas
como
Illustrator
y
fotos
de
programas
como
Photoshop.
La
complicación
surge
de
que
un
dibujo
vectorial
puede
contener
a
su
vez
uno
o
más
"mapas
de
imágenes"
(fotos)
incrustadas
en
su
interior,
y
un
mapa
de
imágenes
puede
contener
uno
o
más
objetos
vectoriales
(trazados,
en
este
caso).
Es
un
poco
como
esas
muñecas
rusas
que
se
contienen
unas
dentro
de
otras.
FORMATOS
COMPARATIVOS
TEXTO
Y
POSTSCRIPT
Cuando
hablamos
de
un
formato,
sobre
todo
en
esto
de
los
textos,
nos
referimos
a
la
parte
visual
y
estética
que
estos
textos
o
documentos
presentan
al
momento
de
ser
presentados
ante
un
lector.
Entre
los
formatos
que
se
pueden
presentar
para
los
archivos
de
texto
no
se
encuentra
mas
que
el
justificado
a
la
izquierda
si
se
pudiera
considerar
este
como
formato,
dado
que
no
se
tiene
un
limite
definido
como
hoja
en
estos
archivos
para
hacer
un
salto
de
línea
o
pagina
en
automático,
púes
como
se
ha
dicho
anteriormente
estos
no
posen
alguna
validación
de
estos
tipos
y
por
ello
son
considerados
archivos
de
texto
plano.
Sin
embargo
la
historia
para
los
procesadores
de
palabras
es
diferente,
estos
pueden
presentar
una
serie
de
manipulaciones
para
representar
textos
en
la
pantalla
y
en
la
impresora
que
por
si
solo
el
archivo
de
texto
no
posee,
así
la
información
puede
obtener
una
apariencia
mas
acorde
a
los
fines
que
se
busquen
para
presentar
dicho
contenido;
por
lo
que
en
cuanto
mas
formato
necesite
determinada
información
esta
requerirá
de
programas
mas
elaborados
y
con
mayores
capacidades
de
formatear
información,
haciendo
un
incremento
en
varios
aspectos
a
la
estructura
del
archivo
resultante,
por
ejemplo,
no
se
tiene
el
mismo
tamaño
en
bytes
si
se
guarda
un
párrafo
en
texto
plano
que
si
se
guarda
el
mismo
párrafo
en
un
editor
de
textos
como
Word
por
ejemplo.
Así
entonces
es
justificable
el
aumento
en
tamaño
del
archivo
conforme
el
formato
que
se
establezca
para
la
información
contenida
en
el
archivo,
sin
embargo
el
tamaño
de
los
archivos
encargados
de
presentar
determinada
información
esta
definido
del
todo
por
formatos,
es
también
conforme
a
la
estructura
del
tipo
de
archivo
que
la
trabaje,
por
ejemplo
un
archivo
“doc”,
“dot”
“docx”
etc.
En
este
trabajo
usaremos
las
estructuras
PostScript
para
presentar
un
texto
en
pantalla
y
también
se
proporcionara
un
formato
justificado
al
texto,
esto
para
tener
alguna
presentación,
sin
embargo
la
opción
de
justificado
no
representa
el
mecanismo
principal
para
ocultar
información.
36
CAPITULO
4
DESARROLLO
DEL
GENERADOR
El
desarrollo
del
generador
completo
se
ha
elaborado
en
el
lenguaje
de
programación
C,
esto
para
poder
presentar
mayor
velocidad
de
trabajo
en
los
equipos
tanto
como
ofertar
mayor
portabilidad
futura
para
el
código
hacia
otros
sistemas
operativos.
La
compilación,
desarrollo
y
pruebas
se
han
llevado
a
cabo
en
el
sistema
operativo
“OS
X
Versión
10.5.8”
con
el
compilador
“GCC
4.0”
bajo
la
herramienta
de
desarrollo
“Xcode
3.1.2”
La
técnica
de
programación
ha
sido
modular
entre
los
dos
programas
que
forman
el
ciclo
de
ocultamiento
–
recuperación
dado
que
la
estructura
interna
del
código
fuente
ha
sido
escrita
con
funciones
que
se
encargan
de
labores
especificas.
El
Programa
generador,
tanto
como
el
Extractor,
están
diseñados
para
recibir
parámetros,
estos
son
el
nombre
de
archivo
de
texto
o
la
ruta
de
un
directorio
para
el
caso
del
Generador,
que
contienen
la
información
que
se
usara
como
portadora
y
de
nombre
para
el
archivo
PostScript
generado
al
final
de
este
proceso
según
corresponda
al
nombre
del
archivo
o
archivos
encontrados
y
el
segundo
parámetro
para
el
programa
generador
define
que
archivo
de
texto
será
ocultado
en
el
o
los
portadores
localizados
que
siempre
deben
ser
archivos
de
texto
plano;
una
apariencia
final
de
la
línea
de
comandos
se
muestra
a
continuación:
Sintaxis:
“./DirTxt2PS
{Directorio
o
Archivo
de
Textos
Portadores}
{Archivo
a
Ocultar}”
Fig.
5.
Aspecto
del
generador
sobre
la
línea
de
comando
Donde
apreciamos
los
parámetros
al
programa
“DirTxt2PS”,
las
cadenas
de
texto
“./DirAbel”
y
“Ocultar.txt”,
siendo
la
primera
un
directorio
donde
se
encuentran
archivos
de
texto
plano
que
serán
utilizados
para
ocultar
el
contenido
del
archivo
“Ocultar.txt”
en
el
formato
PostScript
de
lectura
idéntica
a
los
portadores.
37
Modo
de
Funcionamiento
El
funcionamiento
del
programa
generador
queda
sujeto
a
las
siguientes
premisas
al
momento
de
ser
ejecutado:
•
•
•
Tener
un
conjunto
de
archivos
de
textos
claros
o
uno
solo,
en
donde
ocultaremos
alguna
información
de
texto
plano.
Poseer
la
información
a
ocultar
o
proteger
en
forma
de
texto
claro
para
ocultarla
a
través
del
formato
PostScript.
Tener
permisos
de
escritura
sobre
el
sistema
de
archivos.
Cumplidas
las
premisas
y
en
base
al
flujo
de
la
Fig
6,
se
obtiene
un
archivo
resultado
que
contiene
la
información
oculta
del
archivo
descrito
como
Secreto
y
en
la
lectura
de
este
archivo
se
visualiza
la
misma
lectura
del
texto
portador.
Fig.
6.
Flujo
de
Ocultación
de
Información
Así
el
resultado
final,
visualmente
será
ver
en
el
archivo
PostScript
la
información
que
dicte
el
Archivo
de
texto
portador
y
sin
alguna
señal
visible
de
la
información
a
proteger.
Siendo
la
única
diferencia
entre
el
archivo
portador
y
el
resultado
el
formato
del
archivo;
el
primero
será
un
archivo
de
texto
plano
y
el
final
un
archivo
PS.
Básicamente
el
funcionamiento
interno
del
Generador
es
tomar
del
primer
parámetro
especificado
y
usar
este
valor
para
conocer
si
este
indica
un
directorio
o
un
archivo,
para
el
caso
de
ser
un
directorio
otro
modulo
dentro
del
programa
se
encarga
de
recuperar
todos
los
archivos
de
texto
contenidos
en
el
directorio
y
tener
una
lista
de
estos
archivos,
lista
para
usar
conjunto
al
segundo
parámetro
que
se
especifica,
donde
este
es
conocer
el
archivo
en
texto
plano
que
será
ocultado,
aquí
cabe
mencionar
que
si
se
tiene
una
lista
de
archivos,
la
información
en
el
archivo
a
ocultar
será
colocada
en
cada
uno
de
los
archivos
encontrados
en
el
directorio
especificado.
38
El
programa
generador
llevara
a
cabo
la
tarea
de
crear
el
archivo
con
formato
PostScript
en
base
de
conocer
los
parámetros
que
se
le
indican,
así
pues
la
labor
de
convertir
el
archivo
original
o
portador
en
un
formato
PostScript
debe
tener
implícita
e
inmersa
la
función
de
mezclar
el
archivo
a
ocultar,
esto
para
cumplir
el
objetivo
del
Generador
y
tanto
así
agregar
un
formato
predefinido
al
resultado
final
en
su
versión
PostScript,
este
formato
esta
definido
por
los
valores
siguientes:
•
•
•
•
•
Ancho
de
la
Hoja
Alto
de
la
Hoja
Espacio
entre
líneas
Margen
Izquierdo
Margen
Derecho
•
•
•
•
•
Margen
Superior
Margen
Inferior
Letras
por
Línea
Mayúsculas
por
Línea
Tamaño
de
Letra
En
base
a
este
conjunto
de
parámetros
sobre
la
línea
de
comandos
y
en
ejecución
del
programa
para
el
caso
de
los
parámetros
de
que
tendrá
el
archivo
PostScript,
se
elabora
una
serie
de
procedimientos
para
conformar
una
estructura
PostScript
que
contendrá
ademas
de
aparentemente
el
texto
portador
en
este
formato,
la
información
oculta
en
este
archivo
PS
para
posteriormente
extraerla
como
se
ha
mencionado,
con
el
uso
de
las
métricas
entre
caracteres,
por
lo
que
es
en
el
momento
de
armar
el
archivo
resultante
donde
se
aplicara
la
esteganografía
que
como
se
ha
dicho
es
aprovechar
diferencias
imperceptibles
para
el
ojo
humano
pero
si
medibles
para
un
programa
computacional
y
donde
se
pueden
almacenar
información.
Una
comparativa
de
los
aspectos
de
un
archivo
fuente
de
texto
con
su
archivo
resultante
en
PostScript
es
como
sigue:
Fig.
7.
Archivo
de
Texto
Portador
39
Fig.
8.
Archivo
PostScript
resultante
En
estas
imágenes
observamos
la
apariencia
del
archivo
de
texto
que
se
tiene
y
también
aunque
no
se
muestra
se
tiene
un
archivo
de
texto
plano
para
ocultar,
estos
archivos
son
usados
para
generar
el
archivo
final
con
la
apariencia
del
texto
portador.
Técnica
Esteganografica
La
esteganografía
no
es
una
metodología
ni
un
procedimiento
establecido
dado
que
puede
tomar
muchas
formas
según
el
ingenio
de
quien
lo
aplique,
de
esto
se
ha
hablado
anteriormente,
así
que
en
esta
sección
se
comentara
de
la
técnica
aplicada
en
el
trabajo
y
como
el
PostScript
puede
aportar
gran
manejo
a
dicha
técnica
seleccionada.
El
ocultar
información
como
se
ha
dicho
anteriormente
depende
en
gran
medida
de
tener
una
cantidad
razonable
de
información
para
este
fin,
en
el
caso
de
la
informática,
gran
cantidad
de
bits.
Al
transformar
el
documento
de
texto
plano
a
formato
PostScript
este
ultimo
contiene
mayor
cantidad
de
información
por
el
hecho
de
ser
otro
formato
con
mayores
capacidades
de
presentación
aun
cuando
no
se
tengan
mas
características
agregadas
a
la
información
que
se
obtiene
finalmente.
40
Entre
las
posibilidades
comentadas
para
presentar
información
con
las
estructuras
PostScript
se
había
comentado
acerca
de
una
muy
común
(Representación
de
String
en
Texto
Lineal),
por
ejemplo:
/ms {moveto show} bind ref
(texto cualquiera aquí) 100 200 ms
Sin
embargo
este
ejemplo
complica
poder
insertar
información
oculta
debido
a
la
forma
lineal
en
la
que
se
presenta
el
texto
con
el
comando
PostScript,
en
este
caso
el
texto
que
se
vera
en
pantalla,
que
el
que
se
considera
como
portador.
Luego
entonces
se
tiene
que
si
se
quisiera
Esteganografiar
con
esta
técnica
se
debería
de
tener
alguna
referencia
entre
el
texto
para
indicar
algún
carácter
oculto,
esto
daría
como
resultado
requerir
una
gran
cantidad
de
texto
portador
para
transportar
o
ocultar
una
cantidad
pequeña
de
texto.
De
tal
forma
que
se
tiene
por
elección
una
estructura
PostScript
diferente,
donde
se
involucra
una
característica
del
texto
conocida
como
“métricas”,
esta
métricas
en
los
textos
especifican
las
distancias
que
existen
otras
letras
y
entre
el
mismo
carácter,
y
es
así
que
en
la
estructura
PostScript
puede
especificarse
el
espacio
entre
los
caracteres
que
debe
tener
cada
uno,
esto
ademas
de
permitirnos
alinear
un
párrafo
en
forma
justificada
nos
dará
la
pauta
a
poder
especificar
de
manera
muy
precisa
los
espacios
y
conseguir
entre
esa
precisión
el
poder
incrustar
mas
información
y
es
debido
a
que
tales
números
tan
pequeños
logren
ser
imperceptibles
a
la
vista
humana.
La
siguiente
imagen
muestra
la
apariencia
de
las
métricas
en
un
carácter:
Fig.
9.
Métricas
de
un
carácter
41
Quedando
básicamente
en
el
poder
de
manipulación
de
estos
archivos
PostScript
las
métricas
que
miden
las
distancias
entre
caracteres,
es
decir,
los
espacios
entre
los
caracteres
pueden
llagar
a
definirse
de
manera
muy
precisa,
tanto
que
al
variar
las
ultimas
unidades
numéricas
de
presión
no
pueda
observarse
una
variación
entre
las
distancias
reales
y
las
nuevas
propuestas
por
la
modificación,
terminando
por
ser
esta
la
técnica
esteganografica
aplicada;
es
decir
que
cierta
precisión
entre
caracteres,
representa
una
determinada
letra
que
corresponde
a
las
letras
del
archivo
a
ocultar,
pero
estas
son
disfrazadas
en
los
últimos
tres
dígitos
numéricos
de
una
precisión
de
cientos
de
miles
de
unidades
a
partir
de
punto
decimal,
por
ejemplo,
una
distancia
de
“3.347824”
frente
al
ojo
humano
no
es
diferente
a
la
distancia
“3.347907”
y
estos
últimos
tres
dígitos
“907”
representan
un
carácter
en
valor
ASCII
para
el
documento
de
texto
a
ocultar,
que
son
leídos
posteriormente
por
el
programa
extractor
para
recuperar
la
información
oculta,
cabe
mencionar
que
estas
unidades
están
descritas
en
Pixeles.
Un
ejemplo
visual
de
lo
comentado
como
la
técnica
de
esteganografía
se
muestra
a
continuación:
Steganography
Vs
Steganography
Fig.
10.
Comparativa
de
Textos
Donde
a
vista
del
lector
no
se
puede
observar
una
diferencia
entre
los
textos
y
uno
de
ellos
con
su
formato
PostScript
porta
información
extra
y
esta
como
se
ha
comentado
viaja
en
las
métricas
que
marcan
los
espacios
entre
los
caracteres.
La
estructura
interna
del
PostScript
que
elabora
la
palabra
anterior
es
como
sigue:
50.000000
742.000000
moveto
(Steganography)
[7.060004
4.279072
6.499374
6.499374
5.940111
6.499374
6.499374
Fig.
11.
6.499108
4.829684
] xshow
5.940097
5.939684
6.499374
6.499374
Estructura
PostScript
con
información
Oculta
42
50.000000
742.000000
moveto
(Steganography)
[7.059525
4.279374
6.499374
6.499374
5.939684
6.499374
6.499374
6.499374
4.829684
] xshow
Fig.
12.
5.939684
5.939684
6.499374
6.499374
Estructura
PostScript
sin
información
Oculta
Finalmente
podemos
observar
como
se
puede
escribir
cada
métrica
de
distancia
entre
caracteres
para
las
letras
que
especificamos,
es
decir
que
cada
una
de
estas
métricas
dicta
el
espacio
que
ocupa
cada
carácter.
En
las
métricas
dichas
podemos
observar
un
alto
grado
de
precisión,
estas
distancias
son
muy
precisas
como
para
que
un
ojo
humano
pueda
notar
la
diferencia
entre
ambas
a
la
hora
le
leer
el
documento
PostScript
generado,
Ejemplo:
Fig.
13.
Archivo
PostScript
Sin
Información
Oculta
Fig.
14.
Archivo
PostScript
Con
Información
Oculta
Finalmente
el
“Generador”
nos
permite
ocultar
y
proteger
información
de
tipo
texto
con
otra
del
mismo
tipo
de
dato
con
ayuda
de
la
Esteganografía
en
textos
en
un
solo
comando.
43
Fig.
15.
Comando
de
Generación
de
PS
con
información
Oculta
El
programa
generador
es
entonces
así
el
primer
eslabón
el
proceso
de
ocultamiento
y
protección
de
la
información
que
pretendemos
manejar,
este
se
encarga
de
ocultarla
y
que
sea
insospechable
para
terceras
personas
que
participen
en
las
lecturas
de
estos
documentos
PostScript.
Mas
adelante
se
hablara
de
los
resultados
obtenidos
en
una
prueba
MOS
para
medir
el
nivel
de
ocultamiento
e
imperceptibilidad
de
mas
información
ademas
de
la
que
se
lee.
DESARROLLO
DEL
EXTRACTOR
El
Software
generador
cumple
con
su
trabajo
y
el
ciclo
se
completa
solo
cuando
esta
información
oculta
previamente
puede
volverse
a
poseer,
es
aquí
cuando
el
programa
“Extractor”
cumple
con
finar
el
ciclo
de
transporte
y
de
protección
de
la
información.
El
programa
Extractor
requiere
de
un
archivo
PostScript
previamente
armado,
este
archivo
debe
de
contener
la
estructura
interna
que
se
ha
establecido
para
el
ocultar
información,
dado
que
dicha
información
ha
sido
manejada
y
colocada
en
esta
parte
del
archivo
PostScript,
es
decir,
el
programa
Extractor
se
encargará
de
leer
la
precisión
predeterminada
en
el
programa
generador
para
obtener
de
ella
la
información
oculta
y
con
estos
datos
armar
la
información
protegida
nuevamente
en
el
aspecto
original
del
archivo
protegido
previamente
especificado.
Lo
anterior
tiene
el
siguiente
flujo
de
funcionamiento:
44
Fig.
16.
Flujo
de
Extracción
En
el
flujo
se
tiene
como
premisa
a
cumplir
dos
parámetros,
estos
son
el
indicar
el
archivo
PostScript
que
se
tiene
con
información
oculta
y
el
nombre
del
archivo
a
escribir
con
dicha
información
recuperada,
con
esta
información
el
programa
Extractor
se
encargara
de
tomar
los
valores
colocados
en
el
Stegano
Objeto
y
con
ellos
reconstruir
la
información.
Al
igual
que
el
modulo
del
Generador
este
modulo
se
ha
elaborado
en
C
bajo
el
mismo
sistema
operativo
y
ambiente
de
desarrollo,
implementado
con
la
misma
técnica
de
programación.
En
este
modulo
se
encuentra
la
parte
de
recuperación
de
la
información
oculta
en
la
lectura
de
métricas
como
se
ha
venido
comentado,
así
que
cabe
decir
que
esta
información
puede
ser
vulnerada
en
algún
momento
del
transporte
del
archivo
PostScript,
accediendo
por
medio
de
un
editor
y
no
por
un
visor
de
PostScript,
pero
también
es
importante
conocer
que
la
posibilidad
de
dañar
dicha
información
oculta
es
poco
probable
dado
que
quien
deseara
modificar
la
información
podría
modificar
mas
probablemente
alguna
otra
parte
de
la
estructura
PostScript
ademas
de
la
precisión
de
las
métricas,
es
común
por
ejemplo
desear
modificar
las
cadenas
de
texto
a
mostrar
en
lugar
de
las
posiciones
bajo
la
precisión
en
las
que
se
ha
almacenado
la
información
a
ocultar,
esto
debido
a
que
el
archivo
PostScript
no
es
un
elemento
que
despierte
fácilmente
un
algo
grado
de
sospecha
para
verse
como
candidato
a
ser
un
elemento
de
transporte
de
información
oculta.
La
ventaja
de
que
el
archivo
PostScript
sea
visto
como
un
archivo
mas,
el
cual
contiene
información
“normal”
de
la
que
no
se
sospeche
fácilmente,
oferta
la
ventaja
de
poder
ser
descartado
para
un
stego
Análisis
con
mayor
facilidad
y
continuar
sus
caminos
hasta
llegar
al
destinatario
quien
lo
espera
conjunto
al
programa
Extractor,
al
cual
le
proporcionara
dicho
archivo
como
un
primer
parámetro
y
un
nombre
cualquiera
como
segundo
parámetro
para
obtener
la
recuperación
de
la
información,
como
se
muestra
a
continuación:
45
Fig.
17.
Utilización
en
línea
de
comando
para
el
programa
Extractor
Uso
Ciclo
Ocultamiento
–
Recuperación
Anteriormente
se
ha
comentado
sobre
los
módulos
principales
que
cumplen
el
proteger
o
ocultar
información
tanto
como
el
recuperarla;
a
este
procedimiento
completo
se
le
define
como
el
ciclo
de
Ocultamiento
–
Recuperación.
Ambos
pasos
deben
tener
criterios
a
cumplir
para
que
cumplan
sus
cometidos.
Los
principales
requisitos
son
los
que
requiere
cada
modulo
sobre
la
línea
de
comando.
En
esta
sección
se
describe
como
se
pueden
utilizar
estos
comandos,
también
definidos
como
los
“módulos”
para
cumplir
con
este
ciclo.
El
primero
de
ellos
es
el
comando
“./DirTxt2PS”
secundado
por
el
comando
“./PS2TXT”.
Ambos
trabajan
sobre
el
mismo
sistema
operativo
donde
han
sido
desarrollados
y
según
la
estructura
del
sistema
de
archivos
del
Sistema
Operativo
gestor
donde
han
sido
compilados.
En
ambos
módulos
se
deben
especificar
parámetros
para
que
estos
ejecuten
su
labor.
En
relación
a
la
forma
de
trabajo
para
el
sistema
de
archivos,
se
refiere
a
la
manera
de
indicar
una
ruta
de
un
directorio
o
de
un
archivo
sobre
el
sistema
de
archivos.
Parámetros
para
el
Ocultamiento
En
el
modulo
para
ocultar
o
proteger
información
se
requiere
de
dos
parámetros
principales,
estos
indican
la
ruta
del
archivo
o
directorio
de
o
los
archivos
de
texto
portadores
y
el
archivo
de
texto
plano
a
ocultar
dentro
del
archivo
o
archivos
portadores
respectivamente.
Estos
parámetros
son
separados
por
un
espacio
y
pueden
o
no
ser
especificados
con
ayuda
de
comillas,
por
ejemplo:
./DirTxt2PS
"Portador.txt"
"Secreto.txt"
ó
./DirTxt2PS
Portador.txt
Secreto.txt
46
Además
se
requiere
opcionalmente
de
conocer
para
la
generación
del
PostScript
final
los
parámetros
de
formato,
estos
son:
•
•
•
•
•
Ancho
de
la
Hoja
Alto
de
la
Hoja
Espacio
entre
líneas
Margen
Izquierdo
Margen
Derecho
•
•
•
•
•
Margen
Superior
Margen
Inferior
Letras
por
Línea
Mayúsculas
por
Línea
Tamaño
de
Letra
La
siguiente
imagen
muestra
la
apariencia
que
tiene
la
toma
de
valores
para
los
parámetros
de
formato:
Fig.
18.
Definición
de
Parámetros
de
formato
en
ejecución
del
programa
generador
Los
parámetros
anteriormente
comentados
son
los
requeridos
por
el
programa
generador
para
armar
el
resultado
final
en
el
PostScript
que
ocultara
determinada
información.
Es
importante
comentar
que
en
la
ausencia
de
alguno
de
los
parámetros
principales,
se
tienen
los
casos
siguientes.
47
•
•
Que
no
se
encuentre
el
directorio
o
el
archivo
especificado
para
tener
como
portador
o
portadores.
Que
no
se
encuentre
el
archivo
especificado
a
ocultar
en
los
o
el
portador.
Los
casos
dichos
pueden
ocurrir
al
mismo
tiempo,
sin
embargo
cabe
señalar
que
en
el
segundo
caso
al
no
encontrarse
el
archivo
a
ocultar
si
se
ha
encontrado
el
primer
parámetro
como
valido
se
generara
un
archivo
PostScript
con
los
formatos
definidos
o
no
pero
sin
información
que
viaje
oculta.
Parámetros
y
uso
de
Portadores
Específicamente
el
parámetro
contemplado
para
tomar
como
portador
o
portadores,
puede
ser
un
archivo
o
un
directorio,
de
donde
se
tomaran
todos
los
archivos
de
tipo
texto
plano
para
procesar
como
archivos
portadores
del
segundo
parámetro
que
especifica
la
información
a
ocultar.
En
el
momento
de
especificar
un
directorio,
el
programa
selecciona
solo
los
archivos
de
texto
y
los
convierte
en
archivos
PS
con
o
sin
información
oculta,
según
sea
el
caso,
como
se
muestra
a
continuación.
Ejecutaremos
el
comando:
“./DirTxt2PS
DirAbel
Secreto.txt”
Sobre
la
siguiente
estructura
en
el
sistema
de
archivos:
Fig.
19.
Estructura
de
ficheros
ejemplo
en
Sistema
de
Archivos
Donde
se
aprecian
6
archivos
de
texto
plano
y
un
archivo
de
texto
enriquecido.
Es
importante
saber
que
el
segundo
parámetro
considera
parte
de
su
ruta
al
primer
parámetro
así
el
archivo
“Secreto.txt”
será
buscado
en
el
directorio
que
se
especifica
en
el
primer
parámetro
y
no
como
archivo
existente
a
lado
del
programa
generador.
48
El
contenido
de
cada
archivo
es
muy
variado
y
en
la
siguiente
imagen
solo
se
visualiza
una
pequeña
muestra
del
contenido
de
los
archivos:
Fig.
20.
Ejemplo
de
contenido
en
archivos
de
Texto
En
el
comando
especificamos
el
archivo
de
nombre
“Secreto.txt”
como
archivo
a
ocultar,
para
lo
que
el
programa
generador
tomara
los
archivos
de
texto
plano
excepto
el
de
texto
enriquecido
“RecuperarText.rtf”,
y
con
ello
no
excluirá
el
archivo
“Secreto.txt”
para
trabajar
en
ocultar
información
con
PostScript,
teniendo
un
resultado
lo
siguiente:
Fig.
21.
Nombres
de
archivos
PS
generados
49
Cabe
mencionar
que
a
pesar
de
considerar
el
archivo
“Vacio.txt”
este
no
posee
información,
y
siendo
así
este
no
será
procesado,
por
tanto
no
se
genera
un
archivo
PostScript
vacío
y
por
ende
resultarán
5
archivos
de
los
6
archivos
de
texto
claro
localizados.
Los
archivos
anteriores
tienen
el
siguiente
aspecto
(Lado
izquierdo
de
la
imagen)
bajo
los
parámetros
de
formato
considerados
por
omisión.
Fig.
22.
Comparativa
ente
texto
plano
y
texto
en
PostScript
Cada
uno
de
estos
archivos
contiene
oculta
la
información
del
archivo
“Ocultar.txt”.
Es
importante
señalar
que
para
el
caso
de
que
se
detecte
que
el
archivo
a
ocultar
no
puede
estar
completamente
oculto
en
alguno
de
los
archivos
portadores
de
la
información
a
ocultar,
se
hace
un
anuncio
del
caso
y
se
prosigue
con
proteger
la
información
que
logre
completarse
de
forma
oculta
en
el
archivo
resultante.
Existe
un
caso
particular
que
es
importante
considerar,
este
es
donde
se
oculta
cierta
información
igual,
es
decir
por
ejemplo,
ocultar
el
nombre
“Abel”
en
otra
palabra
“Hola”,
solo
se
podrán
ocultar
las
letras
“Abe”,
pues
debido
a
las
características
de
la
técnica
de
Esteganografía
que
se
usa,
se
tiene
una
capacidad
total
de
proteger
el
texto
requerido
en
otro
texto;
de
el
mismo
número
de
letras
menos
un
carácter
por
renglón,
esto
es
una
gran
ventaja
debido
a
que
en
otros
programas
se
puede
requerir
hasta
mas
de
tres
veces
la
cantidad
de
texto
para
lograr
ocultar
determinado
texto
y
necesitando
para
estos
programas
mas
de
una
palabra
o
cadenas
de
texto
que
la
palabra
o
información
a
ocultar.
50
Parámetros
y
uso
de
Extracción
Los
parámetros
utilizados
en
el
proceso
de
Extracción,
al
igual
que
los
parámetros
del
proceso
de
Ocultación,
se
utilizan
sobre
la
línea
de
comando.
Estos
son
dos
y
se
refieren
a
el
archivo
fuente
que
contiene
la
información
oculta
y
el
segundo
al
nombre
del
archivo
que
deseamos
tenga
la
información
que
se
extraiga,
este
puede
ser
cualquiera
y
podemos
especificar
opcionalmente
un
extensión
de
archivo
de
texto
plano,
generalmente
TXT.
Ambos
parámetros
deben
separarse
por
un
espacio
y
estos
deben
estar
en
el
directorio
del
proceso
de
Extracción.
En
esta
demostración
usaremos
una
estructura
como
se
muestra
a
continuación
para
probar
el
procedimiento
de
extracción.
Fig.
23.
Archivos
de
prueba
para
Extracción
51
Ejemplo
del
comando:
“./PS2TXT
EstudioArte.txt.ps
RecuEstudioArte.txt”
Fig.
24.
Apariencia
de
una
recuperación
de
Información
52
En
la
recuperación
anterior
vemos
el
resultado
de
una
manera
completa
y
exitosa,
esta
consiste
de
que
el
portador
especificado
haya
sido
un
contenedor
suficiente
para
poder
haber
colocado
la
información
que
ahora
vemos
como
recuperada.
Anteriormente
se
comento
acerca
de
la
capacidad
de
almacenar
información
dentro
de
los
archivos
portadores
y
se
estableció
una
referencia
de
la
cantidad
de
información
total
para
lograr
transportar
un
texto,
esta
debe
ser
mayor
en
un
carácter
que
la
cantidad
de
caracteres
a
ocultar
por
renglón,
es
decir,
se
requiere
la
misma
cantidad
de
caracteres
mas
un
carácter
en
el
renglón
de
el
portador
que
la
cantidad
de
caracteres
que
se
tenga
en
el
archivo
a
ocultar,
esto
para
lograr
transportar
todos
los
caracteres
del
archivo
a
ocultar
de
lo
contrario
se
ocultara
hasta
donde
sea
posible,
por
ejemplo
si
se
tienen
exactamente
los
mismos
caracteres,
no
se
podrán
ocultar
los
últimos
caracteres
según
el
número
de
renglones
que
se
tengan.
Este
efecto
puede
apreciarse
en
el
caso
de
ocultar
el
archivo
“Secreto.txt”
en
el
mismo
y
tener
como
resultado
el
archivo
“Secreto.txt.ps”
para
posteriormente
extraer
su
información
que
terminaría
siendo
lo
mismo
que
el
archivo
contiene
originalmente.
Lo
comentado
puede
apreciarse
en
el
siguiente
ejemplo:
+
Portador
+
=
Texto
a
Ocultar
Fig.
25.
=
Archivo
PS
con
Información
Oculta
Ejemplo
de
Ocultación
entre
el
mismo
texto
Se
toma
un
Archivo
de
texto
plano
y
en
el
se
ocultara
la
misma
información
a
manera
de
prueba
para
la
capacidad
de
transporte
para
información
oculta,
para
posteriormente
extraerla
y
comprobar
la
cantidad
de
información
que
se
transporta
oculta.
53
Generado
el
archivo
PostScript
y
una
vez
con
la
apariencia
del
archivo
portador
igual
a
la
del
archivo
de
texto
plano,
pero
con
información
oculta,
cuando
esta
es
la
misma,
el
procedimiento
de
extracción
no
cambia,
aemas
el
resultado
es
el
esperado
en
relación
a
la
capacidad
de
transporte
para
proteger
información.
Fig.
26.
Extracción
de
un
archivo
oculto
en
si
mismo
Podemos
apreciar
como
los
últimos
caracteres,
incluyendo
los
espacios
del
archivo
que
se
han
ocultado
anteriormente
hacen
falta
sobre
la
recuperación
de
información
oculta
cuando
hablamos
de
la
misma
cantidad
de
texto
a
ocultar
como
para
portar.
En
este
ejemplo
faltan
25
caracteres
a
partir
del
final
del
archivo,
estos
caracteres
son
en
relación
a
los
25
renglones
que
se
tienen
del
archivo.
54
CAPITULO
5
La
elaboración
de
pruebas
que
logren
medir
aceptaciones
sobre
una
propuesta,
es
un
resultado
que
nos
permite
evaluar
determinada
aceptación
de
un
evento,
acción
o
objeto.
Dicha
prueba
para
calcular
un
nivel
de
aceptación
acerca
de
lo
que
se
propone,
en
el
caso
de
la
propuesta
de
que
impresos
son
idénticos
a
pesar
de
que
uno
contiene
diferencias,
será
un
valor
de
aceptabilidad
social
frente
a
textos
impresos
en
pantalla
del
formato
PostScript
o
impresos
en
papel,
donde
el
lector
no
logre
encontrar
diferencia
alguna
al
momento
de
comparar
visualmente
estos
documentos
impresos;
aún
cuando
su
forma
interna
en
su
sintaxis
informática
son
diferentes.
Esta
prueba
es
denomina
prueba
MOS
y
se
encarga
de
medir
esta
aceptabilidad
y
la
capacidad
de
adaptación
los
medios
visuales
del
usuario,
que
en
este
caso
será
la
capacidad
de
poder
identificar
como
“idénticos”
o
no
los
archivos
visualizados
o
impresos.
PRUEBA
MOS
Como
parte
del
resultado
obtenido
en
la
prueba
MOS
y
búsqueda
de
la
medida
de
efectividad
a
la
hora
de
ocultar
información
y
presentarla
frente
a
los
lectores
se
ha
designado
un
conjunto
de
archivos
prueba
para
generar
y
presentar
a
fin
de
localizar
diferencias
para
calcular
un
factor
de
aceptabilidad.
A
continuación
se
describen
las
operaciones
de
la
prueba
MOS.
Elaboración
Se
consideran
archivos
de
texto
de
cantidad
considerable
en
caracteres,
hasta
aproximadamente
6500
caracteres,
en
promedio
de
20
hojas,
para
poder
generar
el
archivo
PS
con
información.
A
estos
archivos
se
les
proporcionará
información
a
ocultar
(Otro
archivo
de
texto)
y
se
harán
impresiones
con
estos
resultados,
una
impresión
llevara
información
oculta
y
otra
no
portara
alguna
información.
A
las
impresiones
obtenidas
con
el
generador
del
archivo
PS,
se
les
elabora
un
formulario
de
presentación
para
que
en
la
participación
de
personas
que
tomen
los
documentos
impresos,
seleccionen
las
diferencias
entre
uno
y
otro
texto.
55
PUEBA
DE
DIFERENCIAS
VISIBLES
EN
COMPARACION
El
formato
que
se
ha
publicado
para
la
participación
de
lectores
es
el
siguiente:
___________________________________________________________________________________________________
La
prueba
consiste
en
evaluar
dos
textos
impresos,
uno
de
ellos
contiene
información
oculta,
para
lo
cual
esta
evaluación
nos
ayudara
en
base
a
una
muestra
estadística
a
valorar
la
eficacia
del
ocultamiento
y
el
nivel
de
diferencias
observadas
texto
vs.
texto.
Nivel
de
diferencias:
Texto
1
Texto
2
Texto
3
Sin
ninguna
diferencia
Una
diferencia
Diferencias
muy
especificas
Muy
similares
Completamente
Diferente
Ing.
Cano
Jiménez
Abel
Nota:
Los
textos
que
se
evalúan
son
impresos
en
un
dispositivo
láser
de
impresión
normal
y
no
deben
presentar
alteraciones
físicas
en
el
papel
o
diferentes
tintas
o
marcas.
Sexo:
M
ó
F
,
Edad:
_______
Años
___________________________________________________________________________________________________
Fig.
27.
Formato
para
evaluación
MOS
de
Impresiones
PS
Se
han
generado
tres
tipos
de
archivos,
uno
es
un
texto
de
gran
longitud,
y
los
otros
dos
son
textos
de
memorando
con
formato
respectivos
al
documento.
El
motivo
de
generar
tres
documentos
es
incrementar
la
posibilidad
de
tener
algún
detalle
de
visualización
ademas
de
presentar
diferentes
tipos
de
documentos
al
lector.
En
cuanto
a
que
son
dos
documentos
relativamente
pequeños
se
tiene
para
que
las
comparaciones
sean
mayormente
analizadas
y
no
pasadas
en
la
mayoría
de
sus
detalles
por
alto.
El
Formulario,
se
elabora
de
tal
forma
que
permite
especificar
rápidamente
y
muy
claramente
las
características
que
se
buscan
evaluar,
en
este
estudio,
los
niveles
de
diferencia
que
puedan
localizar
los
lectores
para
cada
uno
de
los
textos
proporcionados.
56
Así
entonces
se
elaboran
100
pruebas
con
los
textos
dichos.
Estos
archivos
impresos
en
el
PostScript
tienen
la
siguiente
apariencia.
Fig.
28.
Primer
Memorando
(Texto
1)
Fig.
29.
Segundo
Memorando
(Texto
2)
57
Fig.
30.
Parte
de
Texto
Largo
en
PostScript
(Texto
3)
Al
momento
de
aplicar
la
prueba
a
cada
una
de
las
personas
se
les
comenta
acerca
de
que
las
lecturas
que
tienen
en
sus
manos,
tienen
impresos
textos
comunes,
y
entre
estos
existen
los
mismos
caracteres
en
tamaño,
forma
y
formato,
sin
embargo
poseen
diferencias
dado
que
uno
de
estos
documentos
posee
información
oculta
y
otro
no,
siendo
así
entonces
la
idea
el
encontrar
alguna
diferencia
con
cualquier
método
que
se
les
ocurra
para
localizarla,
puede
ser
medir,
contraluz,
etc.
Las
maneras
en
las
que
las
personas
han
buscado
diferencia
entre
los
documentos
han
sido
varias,
desde
leer
por
completo
los
documentos
a
fin
de
asegurar
que
no
tienen
algún
carácter
o
inclusive
palabra
diferente
entre
una
cantidad
de
palabras
considerable
como
si
tienen
algún
carácter
de
tamaño
diferente
o
marcado
a
fin
de
armar
una
cadena
posteriormente.
Algunas
otras
personas
optaron
por
comparar
a
contra
luz
la
coincidencia
de
los
caracteres
buscando
diferencias
entre
los
cuadres
de
los
margenes
y
párrafos
de
los
textos;
otros
mas
han
seleccionaron
medir
con
regla
las
distancias
posibles
a
medir
con
este
instrumento
y
buscar
en
posiciones
que
consideraron
claves
alguna
diferencia.
58
RESULTADOS
De
las
100
pruebas
aplicadas
consistentes
en
evaluar
tres
textos,
todas
ellas
a
excepción
de
un
texto
fueron
seleccionados
conforme
lo
esperado
en
el
cuestionario,
marcándose
como
completamente
idénticas
y
sin
alguna
diferencia,
es
decir
que
se
consideraron
los
textos
como
iguales
en
todos
los
sentidos,
a
pesar
de
haberse
comentado
que
tenían
diferencias
entre
ellos.
Cada
uno
de
los
cuestionarios
se
completo
de
manera
satisfactoria
según
lo
esperado,
marcado
como
meta
en
el
desarrollo
de
este
trabajo,
es
decir,
se
ha
conseguido
en
casi
todas
las
pruebas
que
el
usuario
no
dudara
en
decir
que
los
textos;
tanto
el
texto
con
información
oculta
como
el
texto
sin
esta
información
son
completamente
iguales.
En
cuanto
al
único
texto
seleccionado
como
diferente,
la
“diferencia”
que
supuso
localizar
la
persona,
ha
sido
el
Texto
1
(El
primer
Memorando)
y
marcado
como
con
una
diferencia
en
un
acento,
esto
a
juzgar
por
una
mujer
de
21
años.
Aunque
cabe
señalar
que
la
posición
de
los
acentos
no
es
manipulada
en
ningún
momento
por
parte
del
generador
o
extractor
pues
es
considerado
como
parte
del
cuerpo
del
carácter
y
tiene
sus
métricas
definidas
para
la
forma
de
la
letra,
característica
que
no
es
tocada
en
ningún
momento
del
procedimiento
esteganografico.
Considerando
un
porcentaje
de
100
%
el
haber
contestado
por
completo
en
todos
los
casos
de
cuestionario
que
no
se
ha
detectado
alguna
diferencia
en
alguno
de
los
textos
presentados;
y
como
una
persona
en
un
texto
ha
detectado
una
“modificación”
en
un
acento,
se
ha
marcado
con
una
diferencia
en
un
cuestionario,
quedando
un
porcentaje
de
aceptación
muy
cercano
a
100%,
este
porcentaje
es
el
99.66
%,
considerando
300
puntos
para
un
porcentaje
completo
de
respuestas
sin
notar
alguna
diferencia,
dado
que
cada
encuestado
verifico
3
impresiones,
quedando
el
porcentaje
final
dicho
por
ser
299
puntos
obtenidos
en
el
cuestionario.
Con
base
en
los
resultados
visuales
que
se
han
obtenido,
con
los
fundamentados
en
las
encuestas
y
lo
que
se
establece
para
la
protección
que
se
oferta
con
este
método,
se
puede
decir
que
es
en
pleno
aceptable
el
formato
electrónico
e
impreso
en
el
cuanto
al
ocultamiento
y
sospecha
nula
de
transporte
de
información
se
refiere.
Es
decir
que
no
levanta
sospecha
alguna
la
técnica
de
esteganografía
que
se
aplica
para
ocultar
información.
Tal
es
el
resultado
esperado
que
se
ha
obtenido
que
por
el
que
se
puede
decir
que
se
cumple
con
el
objetivo
de
elaborar
un
formato
en
base
a
instrucciones
PostScript
que
se
a
capaz
de
ocultar
y/o
proteger
información
de
textos
planos
por
medio
de
otros
archivos
del
mismo
tipo
presentando
una
lectura
exactamente
igual
al
archivo
que
se
utiliza
como
transporte,
en
este
caso
utilizando
el
PosScript,
todo
para
la
posterior
recuperación
de
información
con
el
programa
de
recuperación
conforme
se
ha
visto
en
el
ciclo
de
ocultamiento
y
recuperación
de
la
información.
59
Es
importante
señalar
que
tanto
la
recuperación
del
archivo
debe
ser
igual
en
su
lectura
como
en
la
estructura
interna
de
archivo
recuperado
contra
el
original
ocultado,
es
decir
a
nivel
binario
la
forma
del
archivo
exceptuando
el
nombre,
dado
que
este
puede
llegar
a
ser
dife
rente,
son
completamente
idénticos.
Para
demostrar
esto
se
elaboro
con
ayuda
de
un
programa
de
comparación
binaria
una
búsqueda
de
diferencias
para
tratar
de
localizar
estas
diferencias
entre
estos
archivos
y
este
programa
analiza
y
compara
bit
a
bit
dichos
archivos.
El
resultado
de
la
comparación
bit
a
bit
que
nos
resulta
es
satisfactoria,
pues
los
archivos
son
señalados
como
completamente
idénticos.
Fig.
31.
Comparación
Binaria
El
resultado
idéntico
a
nivel
binario
nos
dice
que
el
procedimiento
de
recuperación
es
correcto
y
el
ensamble
del
archivo
de
texto
en
este
procedimiento
de
recuperación
es
completado
con
éxito
desde
el
inicio
del
archivo
hasta
su
final,
aunque
esto
es
debido
a
que
el
programa
de
recuperación
le
encarga
este
trabajo
al
sistema
de
archivos
del
sistema
operativo
y
por
tanto
la
estructura
del
archivo
no
se
ve
comprometida
a
excepción
de
la
información
que
se
plasme
en
el
archivo,
que
es
directamente
la
que
depende
del
algoritmo
de
recuperación.
60
APLICACIONES
Y
USOS
Actualmente
existen
muchos
programas
de
Esteganografía,
la
mayoría
de
ellos
trabaja
sobre
grandes
cantidades
de
información,
pocos
y
con
requerimientos
muy
particulares
trabajan
para
los
textos.
Partiendo
de
la
finalidad
de
la
Esteganografía,
sus
usos
y
aplicaciones
principales,
donde
encontramos
el
pasar
determinada
información
por
desapercibida
al
momento
de
buscar
objetos
sospechosos
de
transporte
ocultos
en
una
búsqueda,
tanto
como
el
posesionar
información
o
marcar
información
como
la
marca
de
agua
nos
permite,
son
validas
muchas
técnicas
de
Esteganografía
y
con
forme
los
resultados
esta
técnica
es
valida
y
aplicable
para
los
fines
propuestos.
El
uso
de
la
Esteganografía
varia
según
la
cantidad
de
información
y
conforme
las
capacidades
ofertadas
por
la
creación
de
cada
persona
que
la
realiza.
En
el
caso
de
requerir
transportar
gran
información
en
forma
de
texto
plano
las
ofertas
comerciales
y
no
comerciales
que
se
encuentran
actualmente,
se
enfocan
en
utilizar
medios
informáticos
voluminosos
como
fotografías,
sonidos,
videos,
pero
cuando
lo
que
se
requiere
transportar
es
poco
volumen
informático
y
gran
valor
de
información
como
puede
proporcionar
una
oración
o
un
párrafo
completo
de
texto,
el
utilizar
un
objeto
grande
para
este
objetivo
no
es
algo
muy
eficaz
o
rápido,
por
lo
que
se
ha
propuesto
este
trabajo
con
estos
resultados
bastante
aceptables
y
con
una
gran
velocidad
para
lograr
transportar
cantidades
grandes
de
texto
con
una
relativa
cantidad
de
texto
igual
en
el
archivo
portador.
Como
se
hace
mención
acerca
de
lo
que
importa
proteger
y/o
ocultar
determinada
información
que
brinden
los
textos,
también
es
importante
conseguir
una
rápida
transmisión
de
estos
datos
y
esto
no
se
consigue
con
volumenes
altos
de
información
sino
con
tipos
de
archivos
que
sean
livianos
en
tamaño
para
poderlos
transportar
rápidamente
y
siendo
esto
una
característica
implícita
aunque
no
obligada
de
los
archivos
PostScript,
el
ocultar
información
en
ellos
nos
brinda
una
velocidad
de
trabajo
para
con
estos
archivos
muy
conveniente
para
transmitir
gran
cantidad
de
información
en
textos
por
cualquier
medio
de
almacenamiento
o
transporte
de
red
de
gran
capacidad
actualmente.
Combinada
la
posibilidad
de
transportar
gran
cantidad
de
información
valiosa
con
archivos
que
tienen
la
opción
a
ser
rápidamente
accesibles
por
prácticamente
cualquier
dispositivo
de
impresión
en
pantalla,
como
las
computadoras,
el
manejo
de
esta
protección
a
la
información
puede
generar
el
aplicarse
a
la
compartición,
protección,
transporte
de
secretos
de
muy
variados
tipos,
desde
militares,
gubernamentales
o
hasta
personales.
61
Ademas
de
las
aplicaciones
que
puedan
encontrarse,
es
importante
conocer
el
procedimiento
que
realiza
en
código
fuente
de
la
aplicación
para
no
tener
la
duda
de
los
rastreos
que
puedan
estar
aplicando
las
aplicaciones
comerciales
o
no
pero
sin
acceso
al
código
fuente
sobre
la
información
que
se
oculte,
pueden
haber
puertas
traseras
o
alguna
característica
que
permita
a
otros
ademas
de
los
deseados
conocer
la
información
oculta.
La
forma
en
la
que
se
esta
presentando
el
procedimiento
de
ocultación
de
la
información,
no
es
el
único
que
utiliza
características
del
texto
para
poder
ocultar
información,
sin
embargo
utilizando
las
estructuras
PostScript
que
brindan
las
sintaxis
del
lenguaje
nos
permiten
poder
presentar
información
en
pantalla
de
manera
muy
ágil
y
sin
sospechas
de
que
esta
información
en
pantalla
que
lee
el
usuario
contiene
información
oculta.
Esto
permitiría
que
si
alguna
persona
o
entidad
esta
buscando
comunicados
por
ejemplo
que
puedan
tener
frases
sospechosas
o
estén
comunicando
alguna
información
en
claves,
sean
detectados.
Es
decir
que
con
esta
metodología
es
posible
presentar
cualquier
tipo
de
información
que
pueda
parecer
normal
y
muy
natural
con
información
oculta
sin
ser
visible
de
ninguna
manera
en
pantalla
o
impresión,
situación
que
previamente
ha
sido
comprobada
con
la
prueba
MOS.
62
CAPITULO
6
Modificaciones
Futuras
Una
de
las
situaciones
que
comúnmente
se
presentan
al
final
de
los
proyectos
conforme
al
tiempo
de
desarrollo
para
los
proyectos
es
poder
incrementar
características
y
funcionalidades
que
estén
sobre
la
línea
de
trabajo
en
las
investigaciones
que
se
elaboren.
En
este
trabajo
al
cumplirse
los
objetivos
se
pueden
pensar
determinadas
mejoras
y/o
extensiones
que
pueden
aplicarse.
Una
de
estas
implementaciones
y
talvez
la
mas
importante
es
el
poder
transformar
el
archivo
PostScript
a
un
formato
PDF
debido
a
la
popularidad
que
oferta
este
ultimo
basado
en
PostScript,
otra
puede
ser
mediante
la
criptografía
colocar
el
texto
a
ocultar
en
el
estegano
objeto
ya
cifrado,
para
conseguir
aún
mas
complejidad
para
la
extracción
de
la
información
auque
se
tenga
como
primer
forma
de
la
protección
el
no
sospechar
del
transporte
y/o
protección
de
la
información
oculta
mediante
la
Esteganografía
ademas
de
la
Criptografía.
Otra
posibilidad
es
disminuir
el
tamaño
del
archivo
resultante
mediante
la
reducción
de
precisiones
en
las
posiciones
que
se
marcan
en
cada
letra
para
las
líneas
de
los
párrafos
en
el
PostScript
sin
embargo
esto
debe
estudiarse,
pues
podrían
presentarse
cambios
visibles
en
el
archivo
resultante
final.
Una
muy
amplia
extensión
de
la
aplicación
de
archivos
PostScript
como
medios
portadores
para
ocultar
y/o
proteger
información
con
la
esteganografía,
es
poder
hacerlos
portar
ademas
de
texto
algún
otro
medio
informático,
es
decir,
ademas
de
archivos
de
texto
plano,
lograr
colocar
archivos
de
imágenes,
sonidos,
videos
o
hasta
algún
otro
archivo
como
por
ejemplo
un
ejecutable
y
este
lograr
ensamblarlo
nuevamente.
POSIBLES
MEJORAS
Al
hablar
de
una
expansión
en
este
trabajo,
podemos
contemplar
aspectos
que
en
el
desarrollo
del
trabajo
se
han
contemplado
y
no
se
han
implementado
por
la
delimitación
del
tema
de
la
investigación.
Algunos
de
ellos
se
enlistan
a
continuación
y
quedan
tentativos
a
implementar
en
un
desarrollo
que
brinde
continuidad.
63
Ampliar
opciones
de
Formato
Una
de
las
características
actuales
en
el
programa
son
varios
valores
escalares
para
poder
definir
algunas
características
de
la
presentación
y
el
aspecto
visual
final
que
resulta
del
proceso
de
ocultación
de
un
texto
sobre
otro
resultando
en
el
archivo
PostScript.
Los
valores4
para
personalizar
el
formato
que
se
han
considerado
en
el
programa
de
generación
son
solo
algunos
de
los
que
se
podrían
solicitar
en
el
proceso
de
creación
del
archivo
portador,
ademas
de
que
se
podrían
especificar
de
alguna
otra
forma
para
poder
acelerar
o
facilitar
las
presentaciones
de
los
archivos
que
se
estén
generando,
incluso
podría
ser
ya
algún
archivo
de
configuración
normalizado
para
que
se
tome
por
el
proceso
de
generación
y
este
sea
reflejado
en
el
resultado
visual
del
archivo
PostScript.
Criptografía
antes
de
Esteganografía
La
protección
que
se
oferta
en
este
desarrollo,
esta
basada
en
la
Esteganografía,
que
como
se
ha
comentado
anteriormente
brinda
la
oportunidad
de
pasar
información
por
medio
de
otra
a
manera
que
una
tercera
entidad
en
el
medio
de
la
comunicación
no
sospeche
de
tal
información.
Así
con
tal
característica,
determinada
información
pueda
protegerse.
Adicionando
la
propiedad
de
cifrado
a
dicha
información
a
proteger
por
medio
de
la
Esteganografía,
se
puede
tener
un
“disfraz”
mas
complejo
para
localizar
información
que
se
sospecha
esta
esteganografiada,
esto
haría
pasar
a
la
información
a
proteger
como
simple
ruido
o
parte
del
medio
portador.
Esta
característica
puede
implementarse
antes
o
en
conjunto
al
modulo
de
generación
del
PostScript,
esto
debería
considerarse
pues
no
se
debe
perder
la
finalidad
y
las
propiedades
del
proyecto,
como
velocidad
de
generación,
portabilidad,
etc.
Disminuir
tamaño
de
archivos
finales
Una
propiedad
mas
que
se
vuelve
deseable
pero
hasta
ahora
no
probada
como
estable
y
aprobada
visualmente,
es
el
lograr
disminuir
aún
mas
el
tamaño
del
archivo
final
en
la
cantidad
de
bytes,
esto
comparado
con
un
archivo
común
PDF
con
o
sin
información
esteganografiada.
Es
decir
lograr
hacer
mas
liviano
el
archivo
final
que
portara
la
información
oculta.
Esto
tiene
un
grado
de
complejidad
para
lograrlo
dado
que
en
base
a
la
técnica
de
Esteganografía
aplicada
actualmente,
se
obtiene
un
tamaño
64
proporcional
en
el
archivo
resultante
final
y
este
no
varia
notablemente
de
un
archivo
PostScript
que
contenga
información
y
de
otro
que
no
la
posea,
sin
embargo
esta
forma
de
aplicar
dicha
Esteganografía
es
directamente
relacionada
a
la
minima
posibilidad
de
que
un
observador
pueda
visualizar
alguna
diferencia.
El
adquirir
esta
ventaja
implicaría
modificar
en
alguna
medida
la
técnica
esteganografica,
lo
que
acarrea,
elaborar
nuevas
pruebas
y
generaciones
de
archivos
PostScript
posiblemente
diferentes
en
sus
estructuras
sintácticas.
Incluir
archivos
multimedia
El
lograr
ocultar
información
o
datos
en
texto
dentro
de
otro
texto
es
una
gran
ventaja,
sobre
todo
contra
la
mayoría
de
los
programas
dedicados
a
la
Esteganografía,
sin
embargo
no
es
siempre
la
necesidad
el
ocultar
este
tipo
de
información
en
los
textos.
Así
entonces
la
prestación
que
se
genera
con
este
proyecto
puede
mejorar
si
una
técnica
como
la
propuesta
se
le
adiciona
la
capacidad
de
portar
otro
tipo
de
documentos,
donde
estos
pueden
ser
desde
archivos
de
capacidades
multimedia
hasta
archivos
binarios
o
ejecutables
que
puedan
ser
útiles
en
diferentes
sistemas
operativos
pues
el
archivo
portador
puede
tener
la
finalidad
de
ser
utilizado
en
algún
otro
sistema
operativo
para
extraer
información
o
archivos
útiles
para
el
destino
o
destinatario.
Para
el
caso
de
los
archivos
multimedia,
estos
han
tenido
mayor
desarrollo
en
el
campo
comercial
y
libre
para
la
Esteganografía,
así
que
es
importante
considerarlos
en
un
futuro
para
poder
ensamblar
una
imagen,
un
sonido
o
inclusive
algún
tipo
de
video
a
partir
de
un
archivo
PostScript,
o
considerar
el
tener
varios
archivos
PostScript
para
completar
determinada
capacidad
de
transporte,
debido
a
que
la
cantidad
de
datos
que
arman
un
archivo
de
los
medios
comentados
requiere
mayor
cantidad
de
bytes,
lo
que
nos
obliga
a
tener
dicha
cantidad
en
un
archivo
PostScript,
auque
ademas
puede
considerarse
la
posibilidad
de
tener
mas
de
un
archivo
PostScript
para
completar
el
transporte.
Incluir
archivos
binarios
o
ejecutables
Para
el
caso
de
los
archivos
binarios
o
ejecutables,
tal
como
es
el
caso
de
los
archivos
multimedia,
presentan
el
la
mayoría
de
los
casos
un
tamaño
considerable
de
bytes
que
se
tienen
para
armar
dicho
archivo,
sin
embargo
no
siempre
es
así
y
se
pueden
tener
archivos
muy
livianos
con
grandes
capacidades
de
ejecución
y
labores
en
un
sistema
operativo.
Tal
es
el
caso,
similar
en
tamaño
en
archivos
ejecutables,
pero
aquí
la
diferencia
que
marca
la
posible
mejora
es
el
reensamblar
la
estructura
interna
del
archivo
binario
o
ejecutable
para
que
sea
un
archivo
valido
en
otro
sistema
operativo.
65
Compilación
en
otros
Sistemas
Operativos
Este
proyecto
ha
sido
desarrollado
en
el
sistema
operativo
MAC
OS
X
y
se
compilo
en
el
administrador
de
proyectos
X
Code
con
un
compilador
GCC
sobre
el
lenguaje
de
C;
lo
que
proporciona
a
este
desarrollo
tener
una
gran
portabilidad
hacia
otras
plataformas
pues
no
se
hace
uso
de
librerías
dependientes
del
sistema
operativo.
Lo
anterior
permite
al
momento
de
llevar
el
desarrollo
a
una
plataforma
diferente
,
en
relación
al
sistema
operativo,
se
puede
lograr
una
compilación
sin
mayores
dificultades,
sin
embargo
este
cambio
entre
sistemas
operativos
debe
estudiarse
pues
las
codificaciones
de
los
archivos
de
texto
suelen
ser
utilizadas
en
formas
diferentes,
y
esto
puede
cambiar
el
funcionamiento
o
la
apariencia
que
se
tratan
en
el
programa
generador.
El
caso
mas
probable
es
llevar
el
proyecto
a
un
sistema
operativo
Windows,
para
lo
cual
se
tendrían
que
compilar
y
generar
los
archivos
“.exe”
propios
del
sistema
operativo
para
ejecución
de
programas.
Actualmente
existe
un
ambiente
de
desarrollo
que
utiliza
una
versión
reciente
del
compilador
“gcc”
sobre
Windows,
este
proyecto
tiene
el
nombre
de
“Dev
C++”.
66
CAPITULO
7
CONCLUSIONES
El
trabajo
actual
es
uno
de
varios
posibles
procedimientos
esteganograficos
utilizando
texto
como
portador
de
información
oculta,
sin
embargo
este
trabajo
aporta
un
avance
sobre
la
forma
de
utilizar
estos
textos
para
ocultar
otros
textos;
en
el
caso
aprovecha
a
el
lenguaje
de
PostScript,
que
nos
permite
con
cierta
facilidad
posicionar
caracteres,
puntos
y
vectores
en
cualquier
parte
de
un
área
previamente
definida,
característica
que
se
aprovecha
para
poder
aplicar
Esteganografía
y
aprovechar
las
precisiones
imperceptibles
de
los
caracteres
que
se
pueden
especificar
y
posteriormente
leer
para
obtener
la
información
que
ha
sido
oculta
en
estas
características.
Finalmente
en
base
al
objetivo
de
la
Esteganografia,
el
trabajo
presentado
en
este
desarrollo
alcanza
sus
objetivos,
el
utilizar
la
Esteganografía
para
generar
un
documento
electrónico
PostScript
y
manejar
archivos
de
texto
claro
como
portadores
de
otros
textos
planos
electrónicos,
tanto
como
lograr
hacer
pasar
a
estos
archivos
sin
mayor
importancia
de
la
que
se
lee
en
su
contenido
y
por
desapercibido
el
hecho
de
que
transportan
información
oculta
para
finalmente
extraer
dicha
información
que
siempre
se
ha
considerado
otro
archivo
de
texto
plano
y
escribirlo
en
el
sistema
de
archivos
en
su
forma
original,
perdiendo
únicamente
su
nombre
inicial
y
no
su
contenido.
Se
tiene
así
con
la
combinación
del
formato
electrónico
y
la
Esteganografía
un
resultado
optimo
para
poder
transportar
y
ocultar
gran
cantidad
de
información
obtenida
de
archivos
de
texto
plano
en
archivos
que
presentan
otro
texto
pero
en
el
formato
ya
comentado;
situación
que
ha
sido
prevista
desde
el
inicio
del
desarrollo.
67
BIBLIOGRAFIA
•
•
•
•
•
•
•
A
New
Synonym
Text
Steganography.
M.
Hassan
Shirali‐Shahreza,
Computer
Engineering
Department,
Yazd
University,
Yazd,
IRAN,
[email protected]
Mohammad
Shirali‐Shahreza,
Computer
Science
Department,
Sharif
University
of
Technology,
Tehran,
IRAN,
[email protected]
Steganography
in
MMS.
Mohammad
Shirali‐Shahreza,
Computer
Science
Department,
Sharif
University
of
Technology,
Tehran,
IRAN,
[email protected]
An
Evolution
of
Hindi
Text
Steganography
Kalavathi.Alla,
Christu
Jayanthi
Jubilee
College,
[email protected]
Dr.
R.
Siva
Rama
Prasad,
Acharya
Nagarjuna
University,
[email protected]
A
First
Guide
to
PostScript
Peter
Weingartner,
24
February,
2006,
http://www.tailrecursive.org/postscript/postscript.html
Imagen
Digital.
Qué
es
el
lenguaje
PostScript,
2003,
http://www.gusgsm.com/que_es_el_lenguaje_postscript
PostScript
Salvador
Ramirez
Flandes
(sram),
2000,
http://bosque.udec.cl/~sram/manuals/ps.pdf
Adobe
PostScript
3
Copyright
©
2010
Adobe
Systems
Incorporated,
http://www.adobe.com/products/postscript
68
•
•
•
•
•
•
Linux
Focus.
El
Lenguaje
PostScript,
©
1998
Emre
Demiralp,
Traducido
por
Hugo
Lastras
Membrive
y
César
Ordiéana.
http://es.tldp.org/LinuxFocus/pub/mirror/LinuxFocus/Castellano/May1998/
article43.html
Introducción
al
lenguaje
C
©
1994‐2008
Universidad
de
Las
Palmas
de
Gran
Canaria,
José
Miguel
Santos
Espino
http://sopa.dis.ulpgc.es/so/cpp/intro_c/
Como
programar
en
C/C++
H.M.
Deitel,
/
P.J.
Deitel,
Prentice
Hall,
1994,
2da.
Edición.
Unix
programación
avanzada
Francisco
Manuel
García
Addison
Wesley
Iberoamericana,
1994
1a.
Edición.
Tutorial
Lenguaje
C
Area
de
Servicios,
Departamento
de
Informábamostica,
Universidad
Nacional
de
San
Luis
http://www.dirinfo.unsl.edu.ar/~cur_servicios/fundamentos/manualC2007.p
df
Mean
Opinion
Score
(MOS)
‐
A
Measure
Of
Voice
Quality.
Nadeem
Unuth
http://voip.about.com/od/voipbasics/a/MOS.htm
69
ANEXO
1
Código
Fuente
del
Generador
#include
<iostream>
#include
<fstream>
#include
<dirent.h>
#include
<stdio.h>
#include
<string>
#include
<stdlib.h>
#include
<math.h>
#include
<sys/stat.h>
#include
<time.h>
/*
Incluimos
librerias
propietarias
(
definiciones
y
metricas
)
*/
#include
"definiciones.h"
#include
"TimesNew.h"
unsigned
int
AnchoHoja
=
PageWidthLetter;
unsigned
int
AltoHoja
=
PageHeighLetter;
unsigned
int
EspacioLinea
=
DefaultRowSpacing;
unsigned
int
MargenIzq
=
DefaultLeftMargin;
unsigned
int
MargenDer
=
DefaultRightMargin;
unsigned
int
MargenSuperior
=
DefaultTopMargin;
unsigned
int
MargenInferior
=
DefaultButtonMargin;
unsigned
int
LetrasPorLinea
=
DefaultRowWrap;
unsigned
int
MayusPorLinea
=
DefaultMAYUSCTES;
unsigned
int
TamanyoLetra
=
DefaultFontSize;
unsigned
int
DefParametros
=
0;
char
*TipoDeLetra
=
FuenteDefault;
void
txt2ps(char
*iDirect,
char
*ArtchivoTXT,
char
*ArtchivoPS,
char
*ArtchivoSECR)
/*
Rutina
principal
*/
{
/*
Definiciones
de
proceso*/
FILE
*PtrIn,
*PtrOut,
*PtrExt;
/*
Apuntadores
al
los
archivos*/
char
*FileIn,
*FileOut,
*FileExt,
*CharFinal;
//,
*ElDirectorioX;
struct
stat
file;
char
*Buffer,
*BufferExt,
*Row,
*RowLatin,
*RowExt,
Number[10],
CharAcounte,
unsigned
long
int
i,j,N,N_Ext,E,PtrBufferExt,LongArchivo,LongArchivoExt,Npage,MayusReng;
int
PtrBuffer,
PrintingWidth,
RightMargin,
LeftMargin,
PrintingHeigh,
TopMargin,
ButtonMargin,
RowSpacing,
Ajuste,
Wrap,
L,
L_Ext,
ValOcu,
Aux;
float
Xpos,Ypos,Sum,Dx,AuxF,FontSize,RowsPerPage,*Metrics;
time_t
current_time;
/*
Interpretacion
de
parametros
de
la
linea
de
comandos
*/
FileIn
=
(char
*)
calloc(strlen(iDirect)+1+strlen(ArtchivoTXT),
sizeof(char
));
FileOut
=
(char
*)
calloc(strlen(iDirect)+1+strlen(ArtchivoPS)+3,sizeof(char
));
FileExt
=
(char
*)
calloc(strlen(iDirect)+1+strlen(ArtchivoSECR),sizeof(char
));
for(i=0;i<=strlen(iDirect);i++)
{
FileIn[i]
=
iDirect[i];
FileOut[i]
=
iDirect[i];
FileExt[i]
=
iDirect[i];
}
i‐‐;
FileIn[i]
=
'/';
FileOut[i]
=
'/';
FileExt[i]
=
'/';
i++;
j=i++;
SN;
70
if(strlen(iDirect)
==
1)
{
j
=
2;
i
=
2;
FileIn[1]
=
'\0';
FileOut[1]
=
'\0';
FileExt[1]
=
'\0';
N
=
2;
}
else
N
=
3;
if(strlen(iDirect)
==
0)
{
i
=
1;
N
=
1;
}
for(j=i;j‐i<=strlen(iDirect)+strlen(ArtchivoTXT)‐N;j++)
//
Ajustar
el
4
a
variable
segun
la
condicion
{
FileIn[j‐1]
=
ArtchivoTXT[j‐i];
FileOut[j‐1]
=
ArtchivoPS[j‐i];
}
for(j=i;j‐i<=strlen(iDirect)+strlen(ArtchivoSECR)‐N;j++)
{
FileExt[j‐1]
=
ArtchivoSECR[j‐i];
}
FileOut
=
strcat(FileOut,".ps");
if(!DefParametros)
{
do
{
fprintf(stdout,"\n¿Definir
Nuevos
Valores
a
Parametros
de
Formato?
s/n
");
scanf("%c",&SN);
}while
(SN
!=
's'
&&
SN
!=
'n'
&&
SN
!=
'S'
&&
SN
!=
'N');
if(SN
==
's'
||
SN
==
'S')
{
do{fprintf(stdout,"\n
Ancho
de
la
Hoja
%i
[Entero
+]:
",AnchoHoja);
scanf("%i",&AnchoHoja);
}
while
(AnchoHoja
<=
0);
do{fprintf(stdout,"\n
Alto
de
la
Hoja
%i
[Entero
+]:
",AltoHoja);
scanf("%i",&AltoHoja);
}
while
(AltoHoja
<=
0);
do{fprintf(stdout,"\nEspacio
entre
lineas
%i
[Entero
+]:
",EspacioLinea);
scanf("%i",&EspacioLinea);
}
while
(EspacioLinea
<=
0);
do{fprintf(stdout,"\n
Margen
Izquierdo
%i
[Entero
+]:
",MargenIzq);
scanf("%i",&MargenIzq);
}
while
(MargenIzq
<=
0);
do{fprintf(stdout,"\n
Margen
Derecho
%i
[Entero
+]:
",MargenDer);
scanf("%i",&MargenDer);
}
while
(MargenDer
<=
0);
do{fprintf(stdout,"\n
Margen
Superior
%i
[Entero
+]:
",MargenSuperior);
scanf("%i",&MargenSuperior);
}while
(MargenSuperior
<=
0);
do{fprintf(stdout,"\n
Margen
Inferior
%i
[Entero
+]:
",MargenInferior);
scanf("%i",&MargenInferior);
}while
(MargenInferior
<=
0);
do{fprintf(stdout,"\n
Letras
por
Linea
%i
[Entero
+]:
",LetrasPorLinea);
scanf("%i",&LetrasPorLinea);
}while
(LetrasPorLinea
<=
0);
do{fprintf(stdout,"\nMayusculas
por
Linea
%i
[Entero
+]:
",MayusPorLinea);
scanf("%i",&MayusPorLinea);
}
while
(MayusPorLinea
<=
0);
do{fprintf(stdout,"\n
Tamanyo
de
Letra
%i
[Entero
+]:
",TamanyoLetra);
scanf("%i",&TamanyoLetra);
}
while
(TamanyoLetra
<=
0);
fprintf(stdout,"\n
Ancho
de
la
Hoja
%i",AnchoHoja);
fprintf(stdout,"\n
Alto
de
la
Hoja
%i",AltoHoja);
fprintf(stdout,"\nEspacio
entre
lineas
%i",EspacioLinea);
fprintf(stdout,"\n
Margen
Izquierdo
%i",MargenIzq);
fprintf(stdout,"\n
Margen
Derecho
%i",MargenDer);
fprintf(stdout,"\n
Margen
Superior
%i",MargenSuperior);
fprintf(stdout,"\n
Margen
Inferior
%i",MargenInferior);
fprintf(stdout,"\n
Letras
por
Linea
%i",LetrasPorLinea);
fprintf(stdout,"\nMayusculas
por
Linea
%i",MayusPorLinea);
fprintf(stdout,"\n
Tamanyo
de
Letra
%i",TamanyoLetra);
}
}
//{
/*
Comercial
*/
fprintf(stdout,"\nCopyright(c)
2010
por
Mario
Gonzalez
Lee
&&
Cano
Jiménenez
Abel.\nGrupo
de
Esteganalisis\nIPN
‐
ESIME
CULHUACAN
‐
ESITI\n");
fprintf(stdout,"\nArchivo
de
entrada:
%s\nArchivo
de
salida:
%s\nArchivo
a
ocultar:
%s\n",FileIn,FileOut,FileExt);
if
(!FileIn)
{
fprintf(stdout,"\nNo
se
ha
especificado
el
archivo
de
texto
portador...");
}
71
if
(!FileOut)
{
fprintf(stdout,"\nNo
se
ha
especificado
el
archivo
destino
en
P.S.
...");
}
if
(!FileExt)
{
fprintf(stdout,"\nNo
se
ha
especificado
el
archivo
de
texto
que
sera
ocultado...");
}
PtrIn=fopen(FileIn,"r");
//
Abrimos
al
archivo
para
lectura...
if
(!PtrIn)
/*Desplegamos
mensaje
de
error
y
salimos
de
la
aplicacion...*/
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
encontro
o
no
existe...\n",FileIn);
else
{
/*Procesamos
al
archivo*/
stat(FileIn,&file);
//
verificamos
el
tamanio
del
archivo...
LongArchivo
=
file.st_size;
fprintf(stdout,"\nLongitud
del
Texto
Portador:
%i\n",LongArchivo);
Buffer
=
(char
*)
calloc(LongArchivo,sizeof(char));
//
reservamos
memoria
para
el
Buffer
if(Buffer==NULL)
{
/*
Si
no
se
ha
podido
reservar
memoria...
*/
fprintf(stderr,"ERROR:
No
se
ha
podido
reservar
memoria...\n");
//N=NULL;
//Marca
Warning
en
Windows
N=0;
}
else
N
=
fread(Buffer,sizeof(char),LongArchivo,PtrIn);
/*
Leemos
los
datos
al
Buffer
*/
if
(!N)
{
/*
Si
no
se
han
leido
datos
en
el
archivo...
*/
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
puede
leer
o
no
contiene
datos.\n",FileIn);
free(Buffer);
}
else
{
//***********************************************************************************
PtrExt
=
fopen(FileExt,"r");
//
Abrimos
al
archivo
para
lectura...
if
(!PtrExt)
{
/*
desplegamos
mensaje
de
error
y
salimos
de
la
aplicacion...*/
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
encontro
o
no
existe...\n",FileExt);
}
else
{
/*Procesamos
al
archivo*/
stat(FileExt,&file);
//
verificamos
el
tamanio
del
archivo...
LongArchivoExt
=
file.st_size;
fprintf(stdout,"\nLongitud
del
Texto
a
Ocultar:
%i\n",LongArchivoExt);
BufferExt
=
(char
*)
calloc
(LongArchivoExt+1,sizeof(char));
//
reservamos
memoria
para
el
Buffer
CharFinal
=
(char
*)
calloc(1,sizeof(char));
if(BufferExt
==
NULL
||
CharFinal
==
NULL)
{
/*
Si
no
se
ha
podido
reservar
memoria...
*/
fprintf(stderr,"ERROR:
No
se
ha
podido
reservar
memoria...\n");
//N_Ext
=
NULL;
//Marca
Warning
en
Windows
N_Ext
=
0;
}
else
{
CharFinal
=
"#";
N_Ext
=
fread(BufferExt,sizeof(char),LongArchivoExt+1,PtrExt);
/*
Leemos
los
datos
al
Buffer
*/
}
if
(!N_Ext)
{
/*
Si
no
se
han
leido
datos
en
el
archivo...
*/
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
puede
leer
o
no
contiene
datos.\n",FileExt);
free(BufferExt);
}
else
{
fprintf(stdout,"\nListo
el
Bufeer
Externo...\n");
}
RowExt
=
(char
*)
calloc(LongArchivoExt+1,sizeof(char));
PtrBufferExt
=
0;
72
//*****************************************************************************************
//fprintf(stdout,"\nContenido
del
Archivo
Externo:");
for(j=0;j<=LongArchivoExt;j++)
//
llenamos
los
caracteres
del
renglon
RowExt[j‐PtrBufferExt]
=
BufferExt[j];
//*****************************************************************************************
RowExt[j‐PtrBufferExt]='\0';
PtrBufferExt=j;
/*
Actualizamos
el
puntero..
*/
L_Ext
=
strlen(RowExt);
}
//***********************************************************************************
if(LongArchivoExt
>
LongArchivo)
fprintf(stdout,"\n
La
Cantidad
de
InformaciÛn
a
ocultar
es
Mayor
a
el
Texto
Original");
//
Definiciones
de
parametros...
PtrBuffer
=
‐1;
Wrap
=
LetrasPorLinea;
LeftMargin
=
MargenIzq;
RightMargin
=
MargenDer;
TopMargin
=
MargenSuperior;
ButtonMargin=
MargenInferior;
RowSpacing
=
EspacioLinea;
FontSize
=
DefaultFontSize;
Npage
=
1;
E
=
0;
ValOcu
=
0;
MayusReng
=
0;
//
Calculo
de
parametros
de
trazo
PrintingWidth
=
AnchoHoja‐RightMargin
‐
LeftMargin
;
PrintingHeigh
=
AltoHoja
‐TopMargin
‐
ButtonMargin
;
RowsPerPage
=
floor(PrintingHeigh/RowSpacing);
Xpos
=
LeftMargin;
Ypos
=
AltoHoja‐TopMargin;
//
Reservamos
memoria...
Row
=
(char
*)
calloc(Wrap+1,sizeof(char
));
//
reservamos
memoria
para
renglon
RowLatin=
(char
*)
calloc(Wrap+1,sizeof(char
));
//
reservamos
memoria
para
renglon
Metrics
=
(float
*)
calloc(Wrap+1,sizeof(float));
//
reservamos
memoria
para
renglon
//Comenzamos
a
escribir
el
archivo
PostScript
que
contendra
el
archivo
oculto
current_time
=
time(NULL);
PtrOut
=
fopen(FileOut,"w");
fprintf(stdout,"\n
Escribiendo
.");
//
Imprimimos
encabezado
EPS
fprintf(PtrOut,"%%!PS‐Adobe‐2.0\n%%%%Pages:
\n%%%%Creator:
Mario
Gonzalez
Lee\n");
fprintf(PtrOut,"%%%%Title:
%s\n%%%%PageOrder:
Ascend\n%%%%BoundingBox:
0
0
%d
%d\n",FileIn,AnchoHoja,AltoHoja);
fprintf(PtrOut,"%%%%CreationDate:
%s%%%%BeginSetup\n%%%%PaperSize:
Letter\n%%%%EndSetup\n\n",ctime(&current_time));
fprintf(PtrOut,"%%
ISO
encoding
by
Peter
Vollenweider
(F¸r
unix/mail
Sept
1993)\n");
fprintf(PtrOut,"/ReEncode
{\n");
fprintf(PtrOut,"
exch
findfont\n");
fprintf(PtrOut,"
dup
length
dict\n");
fprintf(PtrOut,"
begin\n");
fprintf(PtrOut,"
{
1
index
/FID
eq\n");
fprintf(PtrOut,"
{
pop
pop
}\n");
fprintf(PtrOut,"
{
def
}
ifelse\n");
fprintf(PtrOut,"
}
forall\n");
fprintf(PtrOut,"
/Encoding
ISOLatin1Encoding
def\n");
fprintf(PtrOut,"
currentdict\n");
fprintf(PtrOut,"
end\n");
fprintf(PtrOut,"
definefont\n");
fprintf(PtrOut,"
pop\n");
fprintf(PtrOut,"}
bind
def\n");
fprintf(PtrOut,"%%
recodificamos
la
fuente
Times‐Roman
en
_Times‐Roman\n");
fprintf(PtrOut,"/Times‐Roman
/_Times‐Roman
ReEncode\n");
73
fprintf(PtrOut,"/_Times‐Roman\tfindfont\n%f
\tscalefont\tsetfont\n\n%%%%Page:
%i
%i\n",FontSize,Npage,Npage);
fprintf(stdout,".");
do
{
/*
Procesamos
al
archivo
*/
Ajuste
=
0;
PtrBuffer
+=
1;
//{
Localizamos
el
incio
y
el
fin
del
renglon.....
MayusReng
=
0;
for(i=PtrBuffer;i<PtrBuffer+Wrap;i++)
{
if(
(
int(Buffer[i])
>=
65
&
int(Buffer[i])
<=
90
)
|
int(Buffer[i])
==
‐124
)
MayusReng++;
//Veo
Puras
Mayusculas
en
el
renglon
if((Buffer[i]
==
ENTER)
|
(Buffer[i]
==
LF)
|
(Buffer[i]
==
'\0')
|
MayusReng
>=
DefaultMAYUSCTES
)
break;
}
if(PtrBuffer+Wrap
<
LongArchivo)
{
if(
(Buffer[i]
!=
ENTER)
&
(Buffer[i]
!=
LF)
&
(Buffer[i]
!=
'\0'))
{
for(;i>0;i‐‐)
//Recorro
atras
hasta
un
espacio
if(Buffer[i]
==
SPACE)
break;
}
}
else
{
if((Buffer[i]
==
ENTER)
|
(Buffer[i]
==
LF)
|
(Buffer[i]
==
'\0'))
{
Ajuste
=
0;
while((Buffer[i]
==
ENTER)
|
(Buffer[i]
==
LF))
{
i++;
Ajuste++;}
//Ajuste
recorre
hacia
atras
el
puntero
a
fin
de
cortar
cuando
hay
un
salto
de
carro
o
linea
nueva,
a
veces
solo
hay
uno
}
else
i
=
LongArchivo;
}
for(j=PtrBuffer;j<i‐Ajuste;j++)
//
llenamos
los
caracteres
del
renglon
{
Row[j‐PtrBuffer]
=
Buffer[j];
}
//Row[j‐PtrBuffer+0]=NULL;
/*
Terminamos
al
renglon...
*/
/*Marca
Warning
en
Windows*/
Row[j‐PtrBuffer+0]
=
'\0';
PtrBuffer
=
j;
/*
Actualizamos
el
puntero..
*/
L
=
strlen(Row);
if(L>0)
{//Si
el
renglon
contiene
mas
de
un
caracter...
//Determinamos
la
justificacion
del
texto
Sum=0;
for(i=0;i<L;i++)
{
Aux
=
(int)
Row[i];
if
(Aux
<=0
)
{
if
(Aux
==
‐121)
{
Aux
=
int('a');
}
else
if
(Aux
==
‐114)
{
Aux
=
int('e');
}
else
if
(Aux
==
‐110)
{
Aux
=
int('i');
}
else
if
(Aux
==
‐105)
{
Aux
=
int('o');
}
else
if
(Aux
==
‐100)
{
Aux
=
int('u');
}
else
if
(Aux
==
‐106)
{
Aux
=
int('n');
}
else
if
(Aux
==
‐124)
{
Aux
=
int('N');
}
else
if
(Aux
==
‐63)
{
Aux
=
int('i');
}
//¡
else
if
(Aux
==
‐76)
{
Aux
=
int('y');
}
else
if
(Aux
==
‐108)
{
Aux
=
int('i');
}
//î
else
if
(Aux
==
‐13)
{
Aux
=
int('U');
}
//Û
else
if
(Aux
==
‐64)
{
Aux
=
int('?');
}
//¿
else
if
(Aux
==
‐97)
{
Aux
=
int('u');
}
//¿
else
if
(Aux
==
‐96)
{
Aux
=
int('T');
}
//†
else
if
(Aux
==
‐113)
{
Aux
=
int('e');
}//è
else
if
(Aux
==
‐14)
{
Aux
=
int('U');
}//Ú
74
else
if
(Aux
==
‐22)
{
Aux
=
int('I');
}//Í
else
if
(Aux
==
‐125)
{
Aux
=
int('E');
}//É
else
if
(Aux
==
‐25)
{
Aux
=
int('A');
}//Á
else
if
(Aux
==
‐18)
{
Aux
=
int('O');
}//Ó
else
if
(Aux
==
‐107)
{
Aux
=
int('I');
}
else
if
(Aux
==
‐85)
{
Aux
=
int('i');
}//´
else
if
(Aux
==
‐95)
{
Aux
=
int('i');
}//°
else
if
(Aux
==
‐56)
{
Aux
=
int('B');
}//
>>
else
if
(Aux
==
‐43)
{
Aux
=
int('i');
}//
’
else
if
(Aux
==
‐48)
{
Aux
=
int('‐');
}//
‐
else
if
(Aux
==
‐91)
{
Aux
=
int('*');
}//
*
else
if
(Aux
==
‐46
|
Aux
==
‐45)
{
Aux
=
int('"');
}
else
{
Aux
=
(int)
Row[i];
}
}
Sum
+=
character[abs(Aux)];
}
if
(
(L‐1)
<=
0
&&
int(Row[i])
<=
0
)
{
if(
L
>.85*Wrap
)
Dx=(AnchoHoja‐LeftMargin‐RightMargin‐Sum);
else
Dx
=
.3*Sum;
}
else
{
if(
L
>.85*Wrap
)
Dx=(AnchoHoja‐LeftMargin‐RightMargin‐Sum)/(L‐1);
else
{
if
(MayusReng
>=
DefaultMAYUSCTES)
Dx
=
.464*Sum/(L‐1);
else
Dx
=
.3*Sum/(L‐1);
}
}
for(i=0;i<L;i++)
//
Justificamos
texto...
{
Aux
=
(int)
Row[i];
if
(Aux
<=
0)
{if
(Aux
==
‐121)
{
AuxF
=
character[abs(int('a'))]
+
Dx;
}
else
if
(Aux
==
‐114)
{
AuxF
=
character[abs(int('e'))]
+
Dx;
}
else
if
(Aux
==
‐110)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐105)
{
AuxF
=
character[abs(int('o'))]
+
Dx;
}
else
if
(Aux
==
‐100)
{
AuxF
=
character[abs(int('u'))]
+
Dx;
}
else
if
(Aux
==
‐106)
{
AuxF
=
character[abs(int('n'))]
+
Dx;
}
else
if
(Aux
==
‐124)
{
AuxF
=
character[abs(int('N'))]
+
Dx;
}
else
if
(Aux
==
‐63)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐76)
{
AuxF
=
character[abs(int('y'))]
+
Dx;
}
else
if
(Aux
==
‐108)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐13)
{
AuxF
=
character[abs(int('U'))]
+
Dx;
}
else
if
(Aux
==
‐64)
{
AuxF
=
character[abs(int('?'))]
+
Dx;
}
else
if
(Aux
==
‐97)
{
AuxF
=
character[abs(int('u'))]
+
Dx;
}
else
if
(Aux
==
‐96)
{
AuxF
=
character[abs(int('T'))]
+
Dx;
}
else
if
(Aux
==
‐113)
{
AuxF
=
character[abs(int('e'))]
+
Dx;
}
else
if
(Aux
==
‐14)
{
AuxF
=
character[abs(int('U'))]
+
Dx;
}
else
if
(Aux
==
‐22)
{
AuxF
=
character[abs(int('I'))]
+
Dx;
}
else
if
(Aux
==
‐125)
{
AuxF
=
character[abs(int('E'))]
+
Dx;
}
else
if
(Aux
==
‐25)
{
AuxF
=
character[abs(int('A'))]
+
Dx;
}
else
if
(Aux
==
‐18)
{
AuxF
=
character[abs(int('O'))]
+
Dx;
}
else
if
(Aux
==
‐107)
{
AuxF
=
character[abs(int('I'))]
+
Dx;
}
else
if
(Aux
==
‐85)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐95)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐56)
{
AuxF
=
character[abs(int('B'))]
+
Dx;
}
else
if
(Aux
==
‐43)
{
AuxF
=
character[abs(int('i'))]
+
Dx;
}
else
if
(Aux
==
‐48)
{
AuxF
=
character[abs(int('‐'))]
+
Dx;
}
else
if
(Aux
==
‐91)
{
AuxF
=
character[abs(int('*'))]
+
Dx;
}
else
if
(Aux
==
‐46
|
Aux
==
‐45)
{
AuxF
=
character[abs(int('"'))]
+
Dx;
}
else
{
AuxF
=
character[abs(Aux)]
+
Dx;
}
}
75
else
{
AuxF
=
character[abs(Aux)]
+
Dx;
}
Metrics[i]
=
AuxF;
}
//Introducir
la
marca
de
agua...
//COLOCAR
LA
INSERCION
DEL
CODIGO
NUMERICO
QUE
DESCRIBA
EL
ACARACTER
ESPECIAL
CON
ACENTOS
fprintf(PtrOut,"\n%f\t%f\tmoveto\n(",Xpos,Ypos);
for(i=0;i<strlen(Row);i++)
{
CharAcounte
=
int(Row[i]);
if(int(Row[i])
==
‐121)
{
fprintf(PtrOut,"\\341");
}//a
else
if
(int(Row[i])
==
‐114)
{
fprintf(PtrOut,"\\351");
}//e
else
if
(int(Row[i])
==
‐110)
{
fprintf(PtrOut,"\\355");
}//i
else
if
(int(Row[i])
==
‐105)
{
fprintf(PtrOut,"\\363");
}
//Capicua//o
else
if
(int(Row[i])
==
‐100)
{
fprintf(PtrOut,"\\372");
}//u
else
if
(int(Row[i])
==
‐106)
{
fprintf(PtrOut,"\\361");
}//Ò
else
if
(int(Row[i])
==
‐25)
{
fprintf(PtrOut,"\\301");
}//¡
else
if
(int(Row[i])
==‐125)
{
fprintf(PtrOut,"\\311");
}//…
else
if
(int(Row[i])
==‐22)
{
fprintf(PtrOut,"\\315");
}//Õ
else
if
(int(Row[i])
==‐18)
{
fprintf(PtrOut,"\\323");
}//”
else
if
(int(Row[i])
==‐14)
{
fprintf(PtrOut,"\\332");
}//⁄
else
if
(int(Row[i])
==‐97)
{
fprintf(PtrOut,"\\374");
}//¸
else
if
(int(Row[i])
==‐63)
{
fprintf(PtrOut,"\\241");
}//¡
else
if
(int(Row[i])
==‐76)
{
fprintf(PtrOut,"\\245");
}//Y
else
if
(int(Row[i])
==‐108)
{
fprintf(PtrOut,"\\356");
}//î
else
if
(int(Row[i])
==‐13)
{
fprintf(PtrOut,"\\333");
}//Û
else
if
(int(Row[i])
==‐64)
{
fprintf(PtrOut,"\\277");
}//¿
else
if
(int(Row[i])
==‐97)
{
fprintf(PtrOut,"\\374");
}//¿
else
if
(int(Row[i])
==‐96)
{
fprintf(PtrOut,"\\254");
}//¿
else
if
(int(Row[i])
==‐113)
{
fprintf(PtrOut,"\\350");
}//è
else
if
(int(Row[i])
==‐14)
{
fprintf(PtrOut,"\\332");
}//Ú
else
if
(int(Row[i])
==‐22)
{
fprintf(PtrOut,"\\315");
}//Í
else
if
(int(Row[i])
==‐125)
{
fprintf(PtrOut,"\\311");
}//É
else
if
(int(Row[i])
==‐25)
{
fprintf(PtrOut,"\\301");
}//Á
else
if
(int(Row[i])
==‐18)
{
fprintf(PtrOut,"\\323");
}//Ó
else
if
(int(Row[i])
==‐107)
{
fprintf(PtrOut,"\\357");
}//I
else
if
(int(Row[i])
==‐85)
{
fprintf(PtrOut,"\\264");
}//´
else
if
(int(Row[i])
==‐95)
{
fprintf(PtrOut,"\\272");
}//´
else
if
(int(Row[i])
==‐56)
{
fprintf(PtrOut,"\\273");
}//>>
else
if
(int(Row[i])
==‐43)
{
fprintf(PtrOut,"\\047");
}//>>
else
if
(int(Row[i])
==‐124)
{
fprintf(PtrOut,"\\321");
}//Ñ
else
if
(int(Row[i])
==‐48)
{
fprintf(PtrOut,"\\255");
}//Ñ
else
if
(int(Row[i])
==‐91)
{
fprintf(PtrOut,"\\267");
}//Ñ
else
if
(int(Row[i])
==‐46
|
int(Row[i])
==‐45)
{
fprintf(PtrOut,"\\042");
}//Ó
else
if
(CharAcounte
==
40
|
CharAcounte
==
41
)
{
fprintf(PtrOut,"\\%c",CharAcounte);
}
else
if
(CharAcounte
==
92)
{
fprintf(PtrOut,"\\%c",CharAcounte);
}
else
{
fprintf(PtrOut,"%c",CharAcounte);
}
}
fprintf(PtrOut,")\n[");
/*Condicion
a
Buscar
el
la
Extraccion
Ojo
con
el
S.O.*/
for(i=0;i<L;i++)
//Imprimimos
las
metricas
{
AuxF
=
Metrics[i];
if(Metrics[i]
!=
0.0)
{
if(E
<
LongArchivo)
{
if
(i
==
0
&&
E
==
0)
{
ValOcu
=
LongArchivoExt;
}
else
{ValOcu
=
(int)
RowExt[E‐1];
if(ValOcu
==
‐121)
{
ValOcu
=
135;
}
//Imprimira
en
recuperacion
la
'a
if(ValOcu
==
‐114)
{
ValOcu
=
142;
}
//La
'e
if(ValOcu
==
‐110)
{
ValOcu
=
146;
}
//La
'i
if(ValOcu
==
‐105)
{
ValOcu
=
151;
}
//La
'o
if(ValOcu
==
‐100)
{
ValOcu
=
156;
}
//La
'u
if(ValOcu
==
‐25)
{
ValOcu
=
231;
}
//Imprimira
en
recuperacion
la
'A
76
genera
nueva
pagina...
if(ValOcu
==
‐125)
{
ValOcu
=
387;
}
//La
'E
if(ValOcu
==
‐22)
{
ValOcu
=
746;
}
//La
'I
if(ValOcu
==
‐18)
{
ValOcu
=
750;
}
//La
'O
if(ValOcu
==
‐14)
{
ValOcu
=
498;
}
//La
'U
if(ValOcu
==
‐106)
{
ValOcu
=
150;
}
//La
'ñ
}
ValOcu
=
abs(ValOcu);
if(ValOcu
<
10)
{
if
(ValOcu)
fprintf(PtrOut,"%.3f00%i\t",Metrics[i],ValOcu);
else
fprintf(PtrOut,"%.6f\t",Metrics[i]);
}
else
if
(ValOcu
<
100
&&
ValOcu
>=
10)
{
if
(ValOcu)
fprintf(PtrOut,"%.3f0%i\t",Metrics[i],ValOcu);
else
fprintf(PtrOut,"%.6f\t",Metrics[i]);
}
else
{
if
(ValOcu)
fprintf(PtrOut,"%.3f%i\t",Metrics[i],ValOcu);
else
fprintf(PtrOut,"%.6f\t",Metrics[i]);
}
}
else
{
fprintf(PtrOut,"%.6f\t",Metrics[i]);
}
E++;
}
}
fprintf(PtrOut,"]
xshow\n");
fprintf(stdout,".");
}
if((L>0)
|
(Buffer[j‐Ajuste]==ENTER)
|
(Buffer[j‐Ajuste]==LF))
Ypos
‐=
RowSpacing‐0;
if
(Ypos<ButtonMargin)
//
si
la
posicion
actual
esta
muy
abajo...
{
Npage
+=
1;
Ypos=AltoHoja‐TopMargin;
fprintf(PtrOut,"\n\nshowpage\n%%%%Page:
%d
%d\n",Npage,Npage);
//
}
}
while(PtrBuffer
<
LongArchivo);
fprintf(PtrOut,"\n\nshowpage\n\n");
fprintf(stdout,".");
//Escribimos
el
numero
de
paginas...
rewind(PtrOut);
//Regresamos
al
principio
del
archivo...
sprintf(Number,"%i",Npage);
fseek(PtrOut,25,SEEK_SET);
fprintf(PtrOut,"%s",Number);
fclose(PtrOut);
//
Liberamos
la
memoria
utilizada*/
FileIn
=
NULL;
FileOut
=
NULL;
FileExt
=
NULL;
Buffer
=
NULL;
Row
=
NULL;
RowLatin
=
NULL;
Metrics
=
NULL;
free(FileIn);
free(FileOut);
free(FileExt);
77
free(Buffer);
free(Row);
free(RowLatin);
free(Metrics);
fprintf(stdout,".");
fprintf(stdout,
"\nHecho...\n\n");
DefParametros++;
}
}
}
/*
***
Final
de
codigo
*****************************/
using
namespace
std;
/*
clase
que
contiene
la
información
de
un
archivo
y
la
posición
del
siguiente
si
hay
*/
class
Archivo
{public:
Archivo(char
*
nombre)
{
nombreArchivo=nombre;
apArchivoSiguiente=NULL;
}
~Archivo();
char
*
mostrarNombreArchivo()
{
return
nombreArchivo;
}
void
apAsignarSiguiente(Archivo
*
siguiente)
{
apArchivoSiguiente=siguiente;
}
Archivo
*
apDevolverSiguiente(Archivo
*
siguiente)
{
return
apArchivoSiguiente;
}
private:
char
*
nombreArchivo;
//hace
referencia
al
siguiente
archivo.
El
ultimo,
siempre
tiene
valor
NULL
Archivo
*
apArchivoSiguiente;
};
/*
Cada
clase
Archivo,
contiene
el
nombre
del
archivo
y
un
apuntador
a
la
siguiente
clase
Archivo.
La
ultima
clase
Archivo,
apunta
a
NULL.
Archivo
Archivo
**********************
|‐‐**********************
|‐‐NULL
*
nombrearchivo
*
|
*
nombrearchivo
*
|
**********************
|
**********************
|
*
apArchivoSiguiente
*‐‐‐
*
apArchivoSiguiente
*‐‐‐
**********************
**********************
*/
/*
clase
que
a
partir
de
un
directorio,
genera
tantas
clase
Archivo
como
archivos
contenga
el
directorio
*/
class
Directorio
{
public:
Directorio(char
*
nombreDir)
{
nombreDirectorio=nombreDir;
apArchivoInicial=NULL;
}
~Directorio();
int
leerDirectorio();
void
mostrarArchivos(char
*ArchivoAOcultar);
private:
//contiene
el
nombre
del
directorio
a
leer
char
*
nombreDirectorio;
//contiene
un
apuntador
a
la
clase
archivo
con
el
primer
archivo
que
se
lee
Archivo
*
apArchivoInicial;
//contiene
un
apuntador
a
la
clase
archivo
con
el
al
ultimo
archivo
guardado
Archivo
*
apArchivo;
};
int
Directorio::leerDirectorio()
{
DIR
*
dir;
struct
dirent
*
fichero;
int
long
unsigned
RNA;
//Recorre
el
Nombre
del
Archivo
int
short
unsigned
pE;
//Puntero
de
Extensi'on
char
Extension[4];
/*
78
*
fichero‐>d_name
Nombre
del
fichero
*
fichero‐>d_type
determina
el
tipo
de
fichero
*/
//abrimos
una
instancia
al
directorio
dir=opendir(nombreDirectorio);
Archivo
*
apTemporal;
//si
devuelve
null,
es
que
ha
habido
algun
error
if
(dir!=NULL)
{
//bucle
para
leer
todos
los
archivos
del
directorio
while
(fichero=readdir(dir))
{
//si
NO
es
un
directorio...
if(fichero‐>d_type!=DT_DIR)
{
pE
=
0;
for(
RNA=0;
RNA
<=
strlen(fichero‐>d_name)‐1;
RNA++)
if
(RNA
>=
strlen(fichero‐>d_name)‐4
)
{
if
(fichero‐>d_name[RNA]
>=
'a'
&&
fichero‐>d_name[RNA]
<=
'z')
Extension[pE]
=
fichero‐>d_name[RNA]
‐
32;
else
Extension[pE]
=
fichero‐>d_name[RNA];
pE++;
}
Extension[4]
=
'\0';
if(!strcmp(Extension,
".TXT"))
{
if(apArchivoInicial==NULL)
{//no
hay
todavia
ningun
fichero
añadido
apArchivoInicial=new
Archivo(fichero‐>d_name);
apArchivo=apArchivoInicial;
}
else
{
//ya
hay
algun
fichero
introducido
//apTemporal
es
igual
apArchivo
apTemporal=apArchivo;
//se
genera
una
nueva
instancia
de
la
case
con
el
nuevo
nombre
apArchivo=new
Archivo(fichero‐>d_name);
//al
apuntador
anterior
se
le
asigna
el
valor
del
nuevo
archivo
apTemporal‐>apAsignarSiguiente(apArchivo);
}
}
}
}
closedir(dir);
return
1;
}
else
{
closedir(dir);
cout
<<
"no
se
ha
podido
abrir
el
directorio:
"
<<
nombreDirectorio
<<
endl;
return
0;
}
};
void
Directorio::mostrarArchivos(char
*ArchivoAOcultar)
{
char
*DNombreDeUnArchivo;
//si
tiene
por
lo
menos
un
archivo
if(apArchivoInicial!=NULL)
{
Archivo
*
apArchivoListado;
//apArchivoListado
toma
el
valor
inicial.
apArchivoInicial
apunta
al
primer
archivo
introducido
apArchivoListado=apArchivoInicial;
//vamos
leyendo
los
diferentes
archivos,
hasta
que
lleguemos
al
ultimo.
En
el
ultimo,
apArchivoSiguiente
apunta
a
NULL
while(apArchivoListado‐>apDevolverSiguiente(apArchivoListado)!=NULL)
{
DNombreDeUnArchivo
=
apArchivoListado‐>mostrarNombreArchivo();
cout
<<
DNombreDeUnArchivo
<<
endl;//mostramos
el
nombre
del
archivo
txt2ps(nombreDirectorio,
DNombreDeUnArchivo,
DNombreDeUnArchivo,
ArchivoAOcultar);
//apArchivoListado
coje
el
valor
del
siguiente
archivo
introducido
apArchivoListado=apArchivoListado‐>apDevolverSiguiente(apArchivoListado);
}
79
DNombreDeUnArchivo
=
apArchivoListado‐>mostrarNombreArchivo();
cout
<<
DNombreDeUnArchivo
<<
endl;
//al
salir
del
while
porque
apArchivoSiguiente
vale
NULL,
todavia
no
hemos
mostrado
el
valor
del
archivo
en
si
txt2ps(nombreDirectorio,
DNombreDeUnArchivo,
DNombreDeUnArchivo,
ArchivoAOcultar);
}
};
int
EsArchivo(char
*
xRuta)
{
int
long
unsigned
iRNA;
//Recorre
el
Nombre
del
Archivo
int
short
unsigned
ipE;
//Puntero
de
Extensi'on
char
iExtension[4];
ipE
=
0;
for(
iRNA=0;
iRNA
<=
strlen(xRuta)‐1;
iRNA++)
if
(iRNA
>=
strlen(xRuta)‐4
)
{
//cout
<<"{"<<fichero‐>d_name[RNA]<<"}";
if
(xRuta[iRNA]
>=
'a'
&&
xRuta[iRNA]
<=
'z')
iExtension[ipE]
=
xRuta[iRNA]
‐
32;
else
iExtension[ipE]
=
xRuta[iRNA];
ipE++;
}
iExtension[4]
=
'\0';
if(!strcmp(iExtension,
".TXT"))
return
1;
//cout
<<
"Se
vera
un
archivo"
<<
endl;
else
return
0;
}
int
main(int
argc,
char
*
argv[])
{
//argc
=
3;
//argv[1]
=
"./DirAbel/EstudioArte.txt";
//argv[2]
=
"./DirAbel/Ocultar.txt";
//cout<<"Establecer
Valores
nuevos
al
formato?
S/N
N
=
Default"<<endl;
bool
i;
Directorio
*
apDirectorio;
if(argc
>=
2)
{
if(!EsArchivo(argv[1]))
{
apDirectorio
=
new
Directorio(argv[1]);
//leemos
el
directorio
i=apDirectorio‐>leerDirectorio();
}
else
{
cout
<<endl<<
"Procesamos
un
archivo
..."
<<
endl;
txt2ps("",
argv[1],
argv[1],
argv[2]);
}
}
else
{
apDirectorio
=
new
Directorio("./");
cout
<<
"Argumentos:
"
<<
argc
<<
endl;
//leemos
el
directorio
i=apDirectorio‐>leerDirectorio();
}//Mostramos
los
archivos
leidos
si
no
ha
habido
ningun
problema
//if(argc
>=
2)
//{
if(!EsArchivo(argv[1]))
{
if(i)
apDirectorio‐>mostrarArchivos(argv[2]);
}
//}
//free(ParametroX);
cout
<<
endl
<<"Listo!,
Proceso
terminado
...."
<<
endl;
//cout
<<
argv[1]
<<
endl
<<
argv[2]
<<
endl;
return
0;
}
80
Código
Fuente
del
Extractor
/*
Info
*******************************************************
File:
main(int
*argc,
char*argv[])
Descripcion:
Main.
Author:
Mario
Gonzalez
Lee.
/
[email protected]
Author:
Cano
JimÈnez
Anel.
/
[email protected]
Date:
20/Sep/2008
Version:
$
1.00
mglee
19/Sep/2008
‐Implementacion
funcional
$
1.10
acanoj
12/Dic/2009
‐Implementacion
funcional
//TODO:
Implementar
generacion
de
marca
de
agua,
implementar
la
insercion
de
la
marca...
*/
//{
/*
Incluimos
librerias
de
proposito
general
y
especifico
*/
#include
<stdio.h>
#include
<string.h>
#include
<stdlib.h>
#include
<math.h>
#include
<sys/stat.h>
#include
<time.h>
/*
Incluimos
librerias
propietarias
(
definiciones
y
metricas
)
*/
#include
"definiciones.h"
#include
"TimesNew.h"
//}
int
main(int
*argc,char
*argv[])
/*
Rutina
principal
*/
{
//
Definiciones
de
proceso*/
FILE
*PtrIn,
*PtrOut;
/*
Apuntadores
al
los
archivos*/
char
*FileIn,
*FileOut;
struct
stat
file;
char
*Buffer,
Number[50];
unsigned
long
int
R,P,N,LongArchivo,
Max;
//
Interpretacion
de
parametros
de
la
linea
de
comandos
*/
FileIn
=
argv[1];
FileOut
=
argv[2];
if
(FileIn
==
NULL)
{
fprintf(stdout,"\nNo
se
ha
especificado
el
archivo
PS
de
entrada");
//FileIn
=
"EstudioArte.txt.ps";
}
if
(FileOut
==
NULL)
{
fprintf(stdout,"\nNo
se
ha
especificado
el
archivo
TXT
de
Recuperación");
//FileOut
=
"ProgramaOculto.txt";
}
//
Comercial
*/
fprintf(stdout,"\nCopyright(c)
2009
por
Mario
Gonzalez
Lee
&&
Cano
JimÈnenez
Abel.\nGrupo
de
Esteganalisis\nIPN\n");
fprintf(stdout,"\nArchivo
de
entrada:
%s\nArchivo
de
salida:
%s\n",FileIn,FileOut);
PtrIn=fopen(FileIn,"r");
//
Abrimos
al
archivo
para
lectura...
if
(!PtrIn)
/*Desplegamos
mensaje
de
error
y
salimos
de
la
aplicacion...*/
{
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
encontro
o
no
existe...\n",FileIn);
}
else
/*Procesamos
al
archivo*/
{
stat(FileIn,&file);
//
verificamos
el
tamanio
del
archivo...
LongArchivo
=
file.st_size;
fprintf(stdout,"\nLongitud
de
Archivo:
%i\\n",LongArchivo);
Buffer
=
(char
*)
calloc(LongArchivo,sizeof(char));
//
Reservamos
memoria
para
el
Buffer
if(Buffer==NULL)
{/*
Si
no
se
ha
podido
reservar
memoria...
*/
81
fprintf(stderr,"ERROR:
No
se
ha
podido
reservar
memoria...\n");
//N=NULL;
//Marca
Warning
en
Windows
N=0;
}
else
N
=
fread(Buffer,sizeof(char),LongArchivo,PtrIn);
/*
Leemos
los
datos
al
Buffer
*/
if
(!N)
{/*
Si
no
se
han
leido
datos
en
el
archivo...
*/
fprintf(stderr,"ERROR:
El
archivo
%s
no
se
puede
leer
o
no
contiene
datos.\n",FileIn);
free(Buffer);
}
else
{
//***********************************************************************************
/*Estamos
Listos
par
Buscar
la
Info
Estego
y
Recuperarla
en
el
archivo
de
salida*/
PtrOut
=
fopen(FileOut,"w");
/*Alisto
el
archivo
de
salida*/
//fprintf(PtrOut,"Recuperardo
por:
Cano
JimÈnez
Abel\n");
fprintf(stdout,"\nArchivo
PS
Cargado...\n");
int
PosX
=
0;
int
Ind
=
0;
P
=
0;
R
=
0;
Max
=
1;
Ind
=
0;
//Vaciamos
el
Arreglo
de
recuperaci'on
para
el
numero
while(Ind
<=
50)
{
Number[Ind]
=
'\0';
Ind++;
}
Ind
=
0;
while(PosX
<=
LongArchivo)
{if
(PosX+4
<=
LongArchivo)
/*Aseguramos
que
haya
tres
caracteres
mas*/
{
if(Buffer[PosX]
==
')'
&&
Buffer[PosX+1]
==
'\n'
&&
Buffer[PosX+2]
==
'['
)
{
PosX
=
PosX
+
4;
while(PosX
<=
LongArchivo
&&
Buffer[PosX]
!=
']'
&&
P
<=
Max)
/*Leeremos
hasta
encontrar
un
]
y
Indique
el
Maximo
de
caracteres
que
se
transportan*/
{if(
(
int(Buffer[PosX])
‐
48
>=
0
&&
int(Buffer[PosX])
‐
48
<=
9
)
||
Buffer[PosX]
==
'.'
)
{//fprintf(stdout,"[%i]",
int(Buffer[PosX])‐48);
/*Capturamos
el
Valor
numerico*/
Number[Ind]
=
Buffer[PosX];
Ind++;
}
else
if
(Buffer[PosX]
==
'\t')
{//if
(Ind
>=
8)
{Number[Ind]
=
'\0';
}
while(Number[R]
!=
'.')
/*Usamos
el
'.'
que
debe
de
venir
en
la
metrica*/
R++;
//A
partir
de
donde
este
el
punto,
recorremos
las
posiciones.
//Pero
recorremos
3
posiciones,
que
son
las
primeras
3
decimas
//que
no
se
toman
en
cuenta
para
transportar
valores.
Number[R+0]
=
Number[R+1];
Number[R+1]
=
Number[R+2];
Number[R+2]
=
Number[R+3];
Number[R+3]
=
'.';
//Finalmente
haremos
Ceros
hasta
donde
este
el
punto
R
=
0;
while(Number[R]
!=
'.')
/*Usamos
el
'.'
que
debe
de
venir
en
la
metrica*/
{
Number[R]
=
'0';
R++;
}
Number[R]
=
'0';
R
=
0;
Number[Ind+1]
=
'\0';
/*Terminamos
de
capturar
el
n'umero*/
Ind
=
0;
if(P)
{
fprintf(stdout,"%c",atoi(Number));
fprintf(PtrOut,"%c",atoi(Number));
}
else
{
//fprintf(stdout,"P
%i
Largo
%i\n",
P,
atoi(Number));
fprintf(stdout,"Texto
Recuperado:\n",
P,
atoi(Number));
Max
=
atoi(Number);
}
Ind
=
0;
//Vaciamos
el
Arreglo
de
recuperaci'on
para
el
numero
82
while(Ind
<=
50)
{
Number[Ind]
=
'\0';
Ind++;
}
Ind
=
0;
P++;
}
else
{
fprintf(stdout,"%c",
Buffer[PosX]);
PosX
=
PosX
+
1;
}
}
}
PosX
=
PosX
+
1;
}
rewind(PtrOut);
//
Regresamos
al
principio
del
archivo...
fseek(PtrOut,25,SEEK_SET);
fclose(PtrOut);
//{
/*
Liberamos
la
memoria
utilizada*/
free(Buffer);
fprintf(stdout,
"\nHecho...\n\n");
}
}
return
0;
}
/*
***
Final
de
codigo
*****************************/
}
83

Descargar