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)
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!