use image::open; use std::path::Path; fn main() -> Result<(), Box> { // Открываем изображение let img = open(&Path::new("super_easy_secret.png"))?.to_rgb8(); // Извлекаем ровно 160 битов из красного канала (20 символов) let mut bits = Vec::new(); for pixel in img.pixels().take(160) { let lsb = pixel[0] & 1; // LSB красного канала bits.push(lsb); } // Проверяем количество битов if bits.len() < 160 { return Err("Недостаточно битов для флага".into()); } // Собираем биты в байты let mut bytes = Vec::new(); for chunk in bits[..160].chunks(8) { if chunk.len() == 8 { let mut byte = 0u8; for (i, &bit) in chunk.iter().enumerate() { byte |= bit << (7 - i); } bytes.push(byte); } } // Проверяем количество байтов if bytes.len() < 20 { return Err("Недостаточно байтов для флага".into()); } // Берем первые 20 байт (длина флага) let flag = String::from_utf8_lossy(&bytes[..20]); println!("Flag: {}", flag); Ok(()) }