42 lines
1.3 KiB
Rust
42 lines
1.3 KiB
Rust
use image::open;
|
|
use std::path::Path;
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// Открываем изображение
|
|
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(())
|
|
} |