AES

Iniciado por LaiaxanIV, 26 Marzo 2016, 19:07 PM

0 Miembros y 1 Visitante están viendo este tema.

LaiaxanIV

AES
Buenas gente, ya vuelvo a estar por aquí!
Tengo dos preguntas para vosotros.

- La primera:
Tengo dos archivos c.key y c.enc.
c.key es la clave para descifrar c.enc que ha sido cifrado con AES. Mi pregunta es, el vector de inicialización IV, se puede inicializar de manera random? Si no, como puedo descifrar el mensaje? Os dejo aqui el codigo en Python.


from Crypto.Cipher import AES
from Crypto import Random


IV = Random.new().read(16)
key = open("c.key").read();
aes = AES.new(key, AES.MODE_CBC, IV)
encrypted = open("c.enc").read()
result = aes.decrypt((encrypted))
open("c.dec",'wb').write(result)


- La segunda:

KS=random(16)
kiv=random(1)
for i in range(0,16) {IV[i]=KS[i]^kiv}
aes_encryptor = AES.new(KS, AES.MODE_CBC,IV)
cryptogram = aes_encryptor.encrypt(Message)
result = IV || cryptogram
open("file.enc",'wb').write(result)


^ significa XOr y || concatenación.

Un archivo ha sido cifrado usando este codigo. ¿Cómo podria descifrarlo? Teoricamente existe una "puerta trasera". Creo que la clave está en hacer fuerza bruta con IV ya que es un valor de 1 Byte y con eso podrias sacar la clave (KS)

Adjunto los archivos:
https://www.dropbox.com/sh/fojv4sqeyc9fu0n/AADZkofN4Ri-jBmsLdgfJb8Ca?dl=0

arget

#1
El IV no es de un solo byte. El IV se genera mediante un XOR entre cada carácter de la clave y dicho byte aleatorio, como la clave es de 16 bytes, el IV también.

Sin embargo, el IV suele ir antepuesto en claro delante del texto cifrado (como puedes ver en el segundo código).

Con esto te digo que ya lo he resuelto, lo sé porque he obtenido una imagen JPG:


arget@kali:~/Escritorio/work$ file result
result: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=0], baseline, precision 8, 1041x993, frames 3


:P

[ Recomiendo esto: http://www.cryptofails.com/post/70059609995/crypto-noobs-1-initialization-vectors ].

P.D.: El archivo puerta_trasera.enc no lo he empleado para absolutamente nada.
La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo.

kub0x

Buenas LaiaxanIV,

es grato ver retos criptográficos por aquí. El modo CBC encadena el bloque del plaintext actual con el ciphertext anterior aplicando XOR sobre ambos y cifrando con la clave (KS) creando así un nuevo ciphertext hasta llegar al último bloque, por lo tanto si no generamos un IV varios mensajes iguales o con el mismo comienzo darían un ciphertext igual en su comienzo o en su totalidad.

Lo he resuelto en C#, pero antes de dártelo mascado te doy un par de pistas:

- El IV inicialmente es 1byte, pero fíjate que se le ha aplicado un XOR con cada byte de la clave (KS), dándonos un IV final de 16bytes.
- La imagen ha sido cifrada obteniendo un ciphertext, y posteriormente se le ha concatenado el IV, por lo tanto si quieres descifrar la imagen debes de quitar los primeros 16 bytes para obtener el ciphertext original.
- Esos 16 primeros bytes que debes quitar son el IV, necesario para instanciar la clase AES encargada del descifrado.
- Quedaría algo así: AES.Decrypt(primeros_16_bytes_del_archivo_cifrado, fichero_cifrado_menos_los_16_primeros_bytes), siendo el primer parámetro el IV y el segundo el resto del bloque.

Aquí te dejo el código utilizado y el link a la imagen, espero te haya servido de ayuda. Cualquier cosa nos dices.

Link a la imagen ->  https://s23.postimg.org/9mccdlzkb/plaintext.jpg (no la pongo como tal porque es grande y no cumple las normas del foro)

Código (csharp) [Seleccionar]
using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AES
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Aes AESCSP = AesCryptoServiceProvider.Create())
            {
                byte[] ciphertext = GetCipherText();
                byte[] plaintext = new byte[ciphertext.Length];
                AESCSP.Mode = CipherMode.CBC;
                AESCSP.Key = File.ReadAllBytes(@"C:\\Users\\kub0x\\Downloads\\c.key");
                AESCSP.IV = GetIV();
                int plainbytes = AESCSP.CreateDecryptor().TransformBlock(ciphertext, 0, ciphertext.Length, plaintext, 0);
                Array.Resize(ref plaintext, plainbytes);
                File.WriteAllBytes(@"C:\\Users\\kub0x\\Desktop\\plaintext.jpg", plaintext);
            }
        }

        private static byte[] GetIV()
        {
            byte[] IV = new byte[16];
            FileStream fs = File.Open(@"C:\\Users\\kub0x\\Downloads\\c.enc",FileMode.Open);
            fs.Read(IV, 0, IV.Length);
            fs.Dispose();
            return IV;
        }

        private static byte[] GetCipherText()
        {
            FileStream fs = File.Open(@"C:\\Users\\kub0x\\Downloads\\c.enc", FileMode.Open);
            byte[] ciph = new byte[fs.Length-16];
            fs.Position = 16;
            fs.Read(ciph, 0, ciph.Length);
            fs.Dispose();
            return ciph;
        }

    }
}


P.D= arget mola ver que a alguien más le interesa este tema por estos lares, ya nadie habla de crypto.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


LaiaxanIV

Muchas gracias kub0x, arget me dio las pistas necesarias para resolver el problema. Lo hice exactamente como has dicho.
Siento no haber marcado como solucionado el tema pero soy nuevo en edte foro y ni sabia que se podia!
Gracias de nuevo por la ayuda!