Crypt Image

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 14

CryptImage Reporte de

( BMP y JPEG ) laboratorio


La traduccin china de Hector Xiang
Cifrar y descifrar un archivo BMP

Propsito
El propsito de este proyecto es mostrar cmo cifrar / descifrar BMP y JPEG archivos
de imagen.

Fondo

La tcnica de cifrado / descifrado de imgenes descrito aqu ser "lo


suficientemente bueno" para muchas aplicaciones de negocios, pero no sera
comparable a las tcnicas utilizadas por el gobierno de Estados Unidos de
la Agencia Nacional de Seguridad . Hay muchas maneras de mejorar la
tcnica de cifrado que se utiliza aqu. Aqu estn algunas otras fuentes de
informacin sobre el cifrado:

Seccin de la criptografa de la efg Biblioteca de Referencia


Matemticas pgina
Criptografa y aritmtica de precisin mltiple- pgina del de
efg Funciones Matemticas Delphi pginas
Libro: Criptografa: Una cartilla
Libro: Applied Cryptography
Libro: Manual de Applied Cryptography

Hay muchas maneras de mejorar tambin la eficiencia de la tcnica se


describe a continuacin. El objetivo de esta pgina es explicar la tcnica, no
optimizarlo.
Una forma sencilla para cifrar una serie de datos de caracteres o datos binarios
es formar una cadena "al azar" de bits, siempre y cuando el original "mensaje"
y "exclusiva o" (XOR) esta cadena aleatoria de bits con el mensaje original a
dar un "mensaje cifrado." Si el receptor del mensaje sabe cmo formar la
misma cadena "al azar" de bits, una segunda "o exclusivo" de la cadena
aleatoria de bits con el mensaje cifrado ser descifrar el mensaje.

Vamos a revisar la mecnica de este proceso. En primer lugar, hay que


recordar cmo la funcin XOR trabaja con bits (valores 0 o 1):

Boolean OR exclusiva (XOR) Funcin

x y x XOR y
00 0
01 1
10 1
11 0

Ahora vamos a empezar con la de un solo byte mensaje de "A" y la cadena


aleatoria de bits "01111010" (o $ 7A en hexadecimal). La siguiente tabla
muestra cmo funciona el proceso de cifrado / descifrado:

Expresin
Paso hexadecimal Binario comentarios
booleana
0100
1. ASCII "A" un $ 41 Mensaje original:
0001
2. Los bits "al 0111 valor pseudo-aleatorio de
segundo $ 7A
azar" 1010 generador de nmeros "al azar"
3. XOR para 0011
un XOR b $ 3B Encriptado "mensaje"
cifrar 1011
4. Los bits "al 0111 Mismas "bits aleatorios" que el
segundo $ 7A
azar" 1010 anterior
5. XOR para (A XOR b) 0100 Descifrado "mensaje" (igual
$ 41
descifrar XOR b 0001 que el original)

Un generador de nmeros pseudo-aleatoria se puede utilizar para calcular los


nmeros "al azar". Si se usa el mismo "semilla" con un generador de nmeros
aleatorios para ambos procesos de cifrado y descifrado, se generar la misma
secuencia "aleatoria". Slo la "semilla" se debe comunicar si tanto el emisor y
el receptor estn utilizando el mismo generador de nmeros aleatorios.

de Borland Ayuda en lnea Nota: "Debido a que la implementacin de la


funcin aleatoria puede cambiar entre las versiones del compilador, no se
recomienda el uso aleatorio para el cifrado o para otros fines que requieren
secuencias reproducibles de nmeros pseudo-aleatorios."

Una variedad de generadores de nmeros aleatorios existe, pero de


Delphi aleatoria funcin se utiliza en los programas que se describen a
continuacin. El RandSeed variable (en el sistema de unidad) es la "semilla"
para el generador de nmeros aleatorios. (Vase la Probabilidad seccin de
la de efg Funciones Delphi matemticas para los generadores de nmeros
aleatorios alternativos.) Si la reproducibilidad a largo plazo es fundamental, se
debe utilizar un generador de nmeros aleatorios para el que tenga el cdigo
fuente, segn lo recomendado por Borland.

Un archivo BMP se puede cifrar y todava se utiliza como un archivo BMP


aunque slo los datos de pxeles lnea de escaneo es encriptada y el
encabezado del archivo no se cambia. Un archivo JPEG vez cifrada no se
puede utilizar como un archivo JPEG hasta que se descifra
correctamente. Estudiar el proceso de cifrado / descifrado BMP primero, ya
que es ms fcil de entender. A continuacin, estudiar el proceso de cifrado /
descifrado JPEG.

Los archivos BMP

Antecedentes BMP

Un BMP archivo (o una TBitmap en la memoria) consiste en un registro de


cabecera de diversa informacin y las lneas de exploracin con datos de
pxeles. Si se encripta el registro de encabezado de un BMP, BMP ya no
puede ser tratado como un mapa de bits. Si slo las lneas de exploracin de
datos de pxeles se cifran - sin ningn cambio en el registro de encabezado -
BMP cifrado resultante todava se puede mostrar como un mapa de bits.

Slo los datos de lnea de barrido de pxeles se cifran en este proyecto por lo
que el archivo TBitmap / BMP resultante todava se puede utilizar como una
imagen. Si est presente, la paleta tambin podra ser encriptada, pero que no
se describe aqu.

Ver la lnea de trazado Nota tcnica para obtener informacin sobre cmo
acceder a los datos de pxeles dentro de un TBitmap .

Materiales y equipamiento
Requisitos de software
de Windows 95/98
Delphi 3/4/5 (recompilar)
CryptBMP.EXE

Requisitos de hardware
de visualizacin VGA con pantalla de 640 por 480 en el modo de
visualizacin de alta color verdadero /

Procedimiento

1. Haga doble clic en el CryptBMP.EXE icono para iniciar el programa.


2. Presione la carga botn y seleccionar un archivo BMP (no
incluido). Pulse el Abrir botn.
3. Si lo desea, desactive el botn de "estiramiento". Normalmente, la
imagen se expande para ajustarse al espacio disponible. En algunos
casos, como con pequeas imgenes, esto puede no ser deseable.
4. Pulse el Cifrar botn para mostrar la imagen encriptada. Esta imagen
cifrada se puede guardar en un archivo BMP seleccionando
el Guardar botn.
5. Experimentar con el Encyrpt y descifrar los nmeros de
semillas . Como se muestra a continuacin, la imagen desencriptada no
coincide con el original cuando estos dos nmeros no son lo mismo.

Tenga en cuenta que el descifrado botn es ms de una etiqueta de un botn


que no hace nada. El proceso de descifrado es llamado automticamente
despus de cualquier cifrado, o cuando se cambia el nmero de semillas
decrypt.
Discusin
Consulte el cdigo fuente completo de todos los detalles, pero aqu se
muestran las principales rutinas de cifrado / descifrado.

El EncryptImage mtodo busca en cada lnea de barrido, independientemente


de PixelFormat y XORs una cadena de bits aleatoria con los datos de pxeles
originales. La imagen cifrada resultante se muestra en la ImageEncrypted
TImage .

Para las imgenes paletizadas, la paleta original se copia a la imagen cifrada.

Cifrar archivos BMP


// No se moleste en tratar de comprender la estructura de pxeles
dentro de la lnea de exploracin.
// Slo tiene que encontrar la longitud de la lnea de escaneado en
bytes y el proceso de todos los bytes.
PROCEDIMIENTO TFormCrypt.EncryptImage;
VAR
i: INTEGER;
j: entero;
RandomValue: BYTE;
Rowin: pByteArray;
rowOut: pByteArray;
ScanlineByteCount: Integer;
EMPEZAR
Si se asigna (BitmapEncrypted)
ENTONCES BitmapEncrypted.Free;
BitmapEncrypted: = TBitmap.Create;
BitmapEncrypted.Width: = BitmapOriginal.Width;
BitmapEncrypted.Height: = BitmapOriginal.Height;
BitmapEncrypted.PixelFormat: = BitmapOriginal.PixelFormat;
// paleta Copiar si la imagen paletizada
SI EN BitmapOriginal.PixelFormat [pf1bit, pf4bit, pf8bit]
ENTONCES BitmapEncrypted.Palette: = CopyPalette
(BitmapOriginal.Palette);
// Esto encuentra el nmero de bytes por lnea de barrido sin
importar PixelFormat
ScanlineByteCount: = ABS (entero (BitmapOriginal.Scanline [1]) -
Entero (BitmapOriginal.Scanline [0]));
TRATAR
RandSeed: = StrToInt (EditSeedEncrypt.Text)
EXCEPTO
RandSeed: = 79997 // utilizar este nmero primo si la entrada no
es vlida
FIN;
Para j: = 0 A BitmapOriginal.Height-1 DO
EMPEZAR
Rowin: = BitmapOriginal.Scanline [j];
RowOut: = BitmapEncrypted.Scanline [j];
FOR i: = 0 A ScanlineByteCount-1 DO
EMPEZAR
RandomValue: = aleatorio (256); // valor 0..255
RowOut [i]: = Rowin [i] XOR RandomValue
FIN
FIN;
ImageEncrypted.Picture.Graphic: = BitmapEncrypted;
DecryptImage;
ButtonDecrypt.Enabled: = TRUE;
ButtonSave.Enabled: = TRUE
FIN {EncryptImage};

Vase el original de Andreas Filsinger resumen de este mtodo de cifrado y


una versin actualizada para Delphi 6.01.

El DecryptImage mtodo funciona muy parecido a la EncryptImage rutina.

Desencriptar archivos BMP


PROCEDIMIENTO TFormCrypt.DecryptImage;
VAR
BitmapDecrypted: TBitmap;
i: INTEGER;
j: entero;
RandomValue: BYTE;
Rowin: pByteArray;
rowOut: pByteArray;
ScanlineByteCount: Integer;
EMPEZAR
BitmapDecrypted: = TBitmap.Create;
BitmapDecrypted.Width: = BitmapEncrypted.Width;
BitmapDecrypted.Height: = BitmapEncrypted.Height;
BitmapDecrypted.PixelFormat: = BitmapEncrypted.PixelFormat;
// paleta Copiar si la imagen paletizada
SI EN BitmapEncrypted.PixelFormat [pf1bit, pf4bit, pf8bit]
ENTONCES BitmapDecrypted.Palette: = CopyPalette
(BitmapEncrypted.Palette);
// Esto encuentra el nmero de bytes por lnea de barrido sin
importar PixelFormat
ScanlineByteCount: = ABS (entero (BitmapEncrypted.Scanline [1]) -
Entero (BitmapEncrypted.Scanline [0]));
TRATAR
RandSeed: = StrToInt (EditSeedDecrypt.Text)
EXCEPTO
RandSeed: = 79997 // utilizar este nmero primo si la entrada no
es vlida
FIN;
Para j: = 0 A BitmapEncrypted.Height-1 DO
EMPEZAR
Rowin: = BitmapEncrypted.Scanline [j];
RowOut: = BitmapDecrypted.Scanline [j];
FOR i: = 0 A ScanlineByteCount-1 DO
EMPEZAR
RandomValue: = aleatorio (256); // valor 0..255
RowOut [i]: = Rowin [i] XOR RandomValue
FIN
FIN;
ImageDecrypted.Picture.Graphic: = BitmapDecrypted;
EditSeedDecrypt.Enabled: = TRUE;
FIN {DecryptImage};

En el pf24bit ejemplo que se muestra en la parte superior de esta pgina, la


imagen encriptada no da ninguna pista sobre qu colores pueden estar
presentes en la imagen original.
Para las imgenes paletizadas (es decir, pf1bit, pf4bit, pf8bit ), la paleta se
copia de la imagen original con la imagen encriptada y slo las lneas de
exploracin estn cifrados. Debido a que alguna informacin acerca de la
imagen est contenida en la paleta, el cifrado de la paleta tambin puede ser
una buena idea, pero que no se hizo en este proyecto.

Por ejemplo, slo los colores de la pf1bit "Smiley" (de la Single-Bit mapas de
bits Informe de Laboratorio) estn presentes en la forma cifrada (ver
abajo). Ocultando estos colores mediante el cifrado de las entradas de la paleta
puede ser deseable.

"Smiley" cifrada Smiley

El uso de un "Nmero Cifrar Semilla" diferente para cada uno y cada


imagen encriptada es bastante importante. Si se utiliza el mismo nmero de
semillas para cifrar dos imgenes, una cierta informacin sobre las dos
imgenes se puede aprender sin el Nmero Cifrar la semilla. Por ejemplo,
suponga que tiene dos imgenes, A y B:

Imgenes originales
UN segundo

Si cifra ambas imgenes con el nmero 19937 Cifrar la semilla, los resultados
parecen ocultar las imgenes:

Imgenes encriptados usando 19937 Semilla


A19937 B19937

Pero ahora si se toma tanto de estas imgenes, y sin ningn conocimiento de


la clave de cifrado original, realizar ciertas operaciones con las imgenes, algo
de informacin acerca de las imgenes originales se pueden ver. Por ejemplo,
si se utiliza XOR con componentes de color correspondiente para cada pxel,
(R, G, B) = (R1 XOR R2, G1 XOR G2, B1 XOR B2), alguna informacin
sobre el original se puede extraer. En particular, muchos vestigios de la
imagen B se pueden ver:

A19937 XOR B19937

Esta imagen es el equivalente a la operacin XOR imgenes A y B originales:

A XOR B

Si suponemos que R es la secuencia aleatoria de bits, esta es la matemtica


que explica por qu la aleatoriedad no oculta la imagen compuesta, A XOR B:

(A XOR R) XOR (B XOR R) = A XOR B

La solucin es utilizar secuencias aleatorias nicas con A y B:

(A XOR R1) XOR (B XOR R2) <> A XOR B

Esto pone de relieve por qu una clave nica se debe utilizar con cada
imagen. Si una imagen se ha cifrado con la clave, 66547, la imagen se
parece mucho a A66547 A19937:

A66547 A19937

Con la clave nica, las operaciones XOR A B son bastante diferentes:

A66547 XOR B19937 A19937 XOR B19937


(Gracias a Christian Berger por destacar esta limitacin en una publicacin en
la pgina de la Comunidad Borland ).

Los archivos JPEG

Antecedentes JPG

A diferencia del archivo BMP, la manipulacin de las lneas de exploracin


"pixel" por separado de cualquier JPG informacin de "cabecera" no es
posible (al menos sin modificar el existente
Delphi TJPEGImage definicin). Por lo que un enfoque diferente debe ser
utilizado. Con JPG, todo el archivo est cifrado. Pero esto significa que el
archivo resultante no puede ser tratada como una imagen JPG.

Materiales y equipamiento

Requisitos de software
de Windows 95/98
Delphi 3/4/5 (recompilar)
CryptJPEG.EXE

Requisitos de hardware
de visualizacin VGA con pantalla de 640 por 480 en el modo de
visualizacin de alta color verdadero /

Procedimiento

1. Haga doble clic en el CryptJPEG.EXE icono para iniciar el programa.


2. Presione la carga botn y seleccionar un archivo JPG ( flower.jpg se
proporciona). Pulse el Abrir botn.
3. Si lo desea, desactive el botn de "estiramiento". Normalmente, la
imagen se expande para ajustarse al espacio disponible. En algunos
casos, como con pequeas imgenes, esto puede no ser deseable.
4. Pulse el Cifrar botn para mostrar la imagen encriptada (vase ms
adelante). Esta imagen cifrada se puede guardar en un .binary archivo
seleccionando el Guardar BIN botn.
5. Experimentar con el Encyrpt y descifrar los nmeros de
semillas . Cuando el partido nmero, la imagen cifrada se descifra
correctamente.
6. Cargar una guardada previamente .binary archivo pulsando la carga
BIN botn. Si la semilla Descifrar es correcta, este archivo .binary
cifrado se puede descifrar y se muestra.

Discusin
Consulte el cdigo fuente completo de todos los detalles, pero aqu se
muestran las principales rutinas de cifrado / descifrado.

La tcnica que se muestra aqu para un JPEG archivo puede ser utilizado con
cualquier archivo de grficos, tales como GIF s, o cualquier otro tipo de
archivo. A diferencia de la BMP proceso de cifrado / descifrado se ha descrito
anteriormente, una vez que un JPEG archivo se cifra, no se puede mostrar
como un archivo de imagen. El cifrado JPEG archivo es un archivo de datos
binarios que deben ser descifrado antes de que pueda ser utilizado de ninguna
manera.

El procesamiento de la carga de un archivo BMP no se explic anteriormente,


ya que era tan sencillo. Sin embargo, adems del proceso "normal" de cargar y
mostrar un TJPEGImage en un TImage , el JPEGarchivo se carga en
un JPEGOriginalBinary TMemoryStream para su posterior procesamiento por
la rutina de cifrado.

Carga de imgenes JPEG


procedimiento TFormCrypt.ButtonLoadJPGClick (Sender: TObject);
VAR
JPEGOriginal: TJPEGImage;
empezar
SI OpenPictureDialog.Execute
luego comenzar
// Carga de imgenes JPEG para la visualizacin
JPEGOriginal: = TJPEGImage.Create;
TRATAR
JPEGOriginal.LoadFromFile (OpenPictureDialog.Filename);
ImageOriginal.Picture.Graphic: = JPEGOriginal
FINALMENTE
JPEGOriginal.Free
FIN;
// Cargar imagen como JPEG binario Corriente
Si se asigna (JPEGOriginalBinary)
ENTONCES JPEGOriginalBinary.Free;
JPEGOriginalBinary: = TMemoryStream.Create;
JPEGOriginalBinary.LoadFromFile (OpenPictureDialog.Filename);
ButtonEncrypt.Enabled: = TRUE;
EditSeedEncrypt.Enabled: = TRUE;
FIN
fin;

Con la BMP archivo, el EncryptImage mtodo se vea en cada lnea de


barrido. Aqu con un JPEG , todo el archivo se trata como una secuencia
binaria de los datos y se cifra byte a byte para formar una nueva secuencia
binaria, JPEGEncryptedBinary (un TMemoryStream ).

Los datos binarios en un TMemoryStream se procesan mediante la obtencin


de un puntero al comienzo de la corriente, tal como en

PIN: = JPEGOriginalBinary.Memory;

El puntero se incrementa, INC (PIN) , ya que cada byte es procesado por


operacin XOR con un byte de una secuencia de bytes "al azar".

Cifrar archivo JPEG


// bytes Cifrar en JPEGOriginalBinary TMemoryStream para dar
JPEGEncryptedBinary
PROCEDIMIENTO TFormCrypt.EncryptImage;
VAR
BitmapDisplay: TBitmap;
i: INTEGER;
PIN: PBYTE;
Pout: PBYTE;
RandomValue: BYTE;
EMPEZAR
TRATAR
RandSeed: = StrToInt (EditSeedEncrypt.Text)
EXCEPTO
RandSeed: = 67547 // utilizar este nmero primo si la entrada no
es vlida
FIN;
Si se asigna (JPEGEncryptedBinary)
ENTONCES JPEGEncryptedBinary.Free;
JPEGEncryptedBinary: = TMemoryStream.Create;
// versin encriptada mismo tamao que la versin original
JPEGEncryptedBinary.Size: = JPEGOriginalBinary.Size;
PIN: = JPEGOriginalBinary.Memory;
Pout: = JPEGEncryptedBinary.Memory;
FOR i: = 1 A JPEGOriginalBinary.Size DO
EMPEZAR
RandomValue: = aleatorio (256); // 0..255
Pout ^: = pin ^ XOR RandomValue;
INC (PIN);
INC (Pout)
FIN;
// JPEGEncryptedBinary No se puede mostrar como una imagen. Por lo
tanto, vamos a
// crear un mapa de bits "ruido" para mostrar su lugar. La "semilla"
para este ruido
// imagen ser el RandSeed sobrante de la encriptacin JPEG, por lo
que la
// ruido de la imagen misma se crear para un determinado JPEG.
BitmapDisplay: = CreateNoiseImage (ImageEncrypted.Width,
ImageEncrypted.Height);
TRATAR
ImageEncrypted.Picture.Graphic: = BitmapDisplay;
FINALMENTE
BitmapDisplay.Free
FIN;
DecryptImage;
ButtonDecrypt.Enabled: = TRUE;
ButtonSaveBIN.Enabled: = TRUE
FIN {EncryptImage};

A diferencia del cifrado BMP archivo, el cifrado JPEG flujo binario no se


puede mostrar como una imagen. Para mostrar algo de este archivo cifrado,
una imagen de "ruido" se muestra en lugar, que fue creado como se muestra a
continuacin:

Crear imagen de ruido


// Crear pf24bit imagen "ruido" por medio de nmeros aleatorios
FUNCIN CreateNoiseImage (CONST Anchura, Altura: INTEGER): TBitmap;
VAR
i: INTEGER;
j: entero;
fila: pByteArray;
EMPEZAR
RESULTADO: = TBitmap.Create;
RESULT.Width: = Anchura;
RESULT.Height: = Altura;
RESULT.PixelFormat: = pf24bit;
Para j: = 0 a la altura-1 DO
EMPEZAR
fila: = RESULT.Scanline [j];
FOR i: = 0 A 3 * Ancho-1 DO // 3 bytes por pxel
EMPEZAR
fila [i]: = Random (256)
FIN
FIN
FIN {CreateNoiseImage};
El DecryptImage mtodo funciona muy parecido a
la EncryptImage rutina. Despus se forma el flujo binario
descifrado, JPEGDecryptedBinary , esta corriente se carga en un
nuevo TJPEGImage . Si hay alguna excepcin en este proceso (por ejemplo,
el archivo descifrado nunca fue un archivo JPEG o el descifrado hizo ningn
resultado en un archivo JPEG), a continuacin se muestra una imagen de
"ruido".

Descifrar el archivo JPEG


PROCEDIMIENTO TFormCrypt.DecryptImage;
VAR
BitmapDisplay: TBitmap;
i: INTEGER;
JPEGDecrypted: TJPEGImage;
JPEGDecryptedBinary: TMemoryStream;
PIN: PBYTE;
Pout: PBYTE;
RandomValue: BYTE;
EMPEZAR
TRATAR
RandSeed: = StrToInt (EditSeedDecrypt.Text)
EXCEPTO
RandSeed: = 67547 // utilizar este nmero primo si la entrada no
es vlida
FIN;
JPEGDecryptedBinary: = TMemoryStream.Create;
TRATAR
// versin descifrado mismo tamao que la versin encriptada
JPEGDecryptedBinary.Size: = JPEGEncryptedBinary.Size;
PIN: = JPEGEncryptedBinary.Memory;
Pout: = JPEGDecryptedBinary.Memory;
FOR i: = 1 A JPEGEncryptedBinary.Size DO
EMPEZAR
RandomValue: = aleatorio (256); // 0..255
Pout ^: = pin ^ XOR RandomValue;
INC (PIN);
INC (Pout)
FIN;
// En este punto el flujo binario descifrado JPEG es en el
// corriente JPEGDecryptedBinary. Cargar esta corriente de memoria
en la
// JPEGDecrypted TJPEGImage.
JPEGDecrypted: = TJPEGImage.Create;
TRATAR
TRATAR
JPEGDecrypted.LoadFromStream (JPEGDecryptedBinary);
ImageDecrypted.Picture.Graphic: = JPEGDecrypted;
EXCEPTO
// Si se produce algn error en la conversin, simplemente
mostrar una imagen de ruido
BitmapDisplay: = CreateNoiseImage (ImageEncrypted.Width,
ImageEncrypted.Height);
TRATAR
ImageDecrypted.Picture.Graphic: = BitmapDisplay;
FINALMENTE
BitmapDisplay.Free
FIN;
FIN
FINALMENTE
JPEGDecrypted.Free
FIN
FINALMENTE
JPEGDecryptedBinary.Free
FIN;
EditSeedDecrypt.Enabled: = TRUE;
FIN {DecryptImage};

Conclusiones
cifrado utilizando una secuencia de bytes aleatorios y XOR es un proceso
bastante sencillo. Una tcnica similar se puede aplicar a otros tipos de
archivos.

Un archivo BMP cifrado todava se puede mostrar como un archivo BMP. Un


archivo JPEG cifrado es una secuencia binaria que no puede ser entendido
como una imagen JPEG hasta (y menos) se descifra correctamente.

Gracias a Morten Jacobsen de Noruega por preguntar cmo una imagen puede
ser encriptado.

Palabras clave
XOR, al azar, RandSeed, BMP, JPEG, TBitmap, TJEGImage, Scanline,
PixelFormat, paleta, CopyPalette, TMemoryStream, ruido de la imagen,
PBYTE, pByteArray, TMemoryStream.Memory, LoadFromFile,
LoadFromStream, ShellExecute, EditNumericKeyPress

Descargar
Delphi 3/4/5 Fuente y EXE: CryptBMP.ZIP (138 KB) y CryptJPEG.ZIP (191
KB)

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy