Өнгөрсөн файлуудын стеганографи: өгөгдлийг салбаруудад шууд нуух

Богино оршил

Хэрэв хэн нэгэн санахгүй байгаа бол стеганографи нь зарим саванд мэдээллийг нууж байна. Жишээлбэл, зурган дээр (хэлэлцсэн энд и энд). Та мөн файлын системийн үйлчилгээний хүснэгтэд өгөгдлийг нууж болно (энэ тухай бичсэн энд), тэр ч байтугай TCP протоколын үйлчилгээний багцуудад. Харамсалтай нь эдгээр бүх аргууд нь нэг сул талтай: мэдээллийг саванд "оруулах" тулд савны дотоод бүтцийн онцлогийг харгалзан үздэг зальтай алгоритмууд хэрэгтэй. Мөн савны заль мэхийг эсэргүүцэхтэй холбоотой асуудал үүсдэг: жишээлбэл, хэрэв та зургийг бага зэрэг засварлавал далд мэдээлэл алга болно.

Өгөгдөлтэй зальтай алгоритм, нарийн заль мэхгүйгээр ямар нэгэн байдлаар хийж, контейнерын ажиллагаа, далд өгөгдлийн аюулгүй байдлын зөвшөөрөгдөх түвшинг хангах боломжтой юу? Урагшаа хараад би хэлэх болно - тийм ээ, чи чадна! Би танд хэрэглүүрийг хүртэл санал болгоно.

Аргын цуст дэлгэрэнгүй мэдээлэл

Үндсэн санаа нь духан дээр цохих шиг энгийн зүйл юм: үйлдлийн систем хэзээ ч бичдэггүй (эсвэл ховор тохиолдолд бичдэг) дискэн дээрх хэсгүүд байдаг. Эдгээр хэсгүүдийг зальтай алгоритмаар хайх шаардлагагүй болгохын тулд бид илүүдлийг ашиглах болно, өөрөөр хэлбэл бид дискний бүх секторт далд мэдээллээ олон удаа хуулбарлах болно. Дараа нь, энэ бүх сүр жавхлан дээр та шаардлагатай хуваалтуудыг үүсгэж, файлын системийг форматлаж, файл бичиж, үйлдлийн системүүдийг суулгаж болно - бүгд ижилхэн нууц өгөгдлийн нэг хэсэг нь хадгалагдаж, дахин сэргээгдэх боломжтой бөгөөд давтан хуулбарлах нь бидэнд туслах болно. эх хувийг бүхэлд нь хэсгүүдээс нь нийлүүл.

Энэ аргын давуу тал нь тодорхой юм: бид файлын формат, тэр ч байтугай ашигласан файлын системийн төрлөөс хамаардаггүй.

Сул талууд нь бас ойлгомжтой гэж би бодож байна:

  • Нууц өгөгдлийг зөвхөн дискийг бүхэлд нь дахин бичиж, дараа нь хэрэглэгчдэд харагдах контентыг дахин үүсгэх замаар л өөрчилж болно. Гэсэн хэдий ч та дискийг зургаас дахин үүсгэх програм хангамжийг ашиглах боломжгүй: энэ нь өмнөх нууц өгөгдлийг дахин үүсгэх болно.
  • Нууц мэдээллийн хэмжээ их байх тусам зарим мэдээллийг алдах магадлал өндөр байдаг.
  • Дискээс өгөгдлийг сэргээхэд удаан хугацаа шаардагдана. Хэдэн минутаас хэдэн өдөр хүртэл (орчин үеийн дискүүд том хэмжээтэй).

Одоо тодорхой зүйл рүү шилжье.

Хэрэв та дискэн дээрх нууц мэдээллийг зүгээр л түрхэж байвал энэ нь зөвхөн нүцгэн нүднээс нуугдах нь ойлгомжтой. Хэрэв та харцаа дискний засварлагчаар тоногловол өгөгдөл бүх алдар суугаараа харагдах болно. Тиймээс, өгөгдлийг харуулахгүйн тулд шифрлэх нь зүйтэй юм. Бид энгийн боловч амттай шифрлэх болно: aes256-cbc алгоритмыг ашиглан. Бид хэрэглэгчээс шифрлэлтийн түлхүүрийг асууж, түүнд сайн нууц үг гаргаж өгөх болно.

Дараагийн асуулт бол "сайн" өгөгдлийг муу өгөгдлөөс хэрхэн ялгах вэ? Энд шалгах нийлбэр бидэнд туслах болно, гэхдээ энгийн биш, харин SHA1. Тэгээд юу гэж? Энэ нь git-д хангалттай сайн тул бидэнд ч бас тохирох болно. Шийдвэрлэсэн: бид хадгалсан мэдээлэл бүрийг шалгах нийлбэрээр хангадаг бөгөөд хэрэв код тайлсны дараа таарч байвал шифрлэлт амжилттай болсон гэсэн үг.

Мөн танд фрагментийн дугаар болон нууц өгөгдлийн нийт урт хэрэгтэй болно. Фрагментийн дугаар нь аль хэсгүүдийг аль хэдийн тайлж, аль нь үлдсэнийг хянах явдал юм. Шаардлагагүй өгөгдлийг (өөрөөр хэлбэл дэвсгэр) бичихгүйн тулд сүүлийн фрагментийг боловсруулахад нийт урт нь бидэнд хэрэгтэй болно. Бид гарчигтай хэвээр байгаа тул нууц файлын нэрийг тэнд нэмэх болно. Шифрийг тайлсны дараа үүнийг хэрхэн нээхийг тааварлахгүй байх нь ашигтай байх болно.

Энэ аргыг практикт туршиж үзэх

Шалгахын тулд хамгийн түгээмэл хэрэгсэл болох флаш дискийг авч үзье. Би 1 ГБ багтаамжтай хуучин нэгийг олсон бөгөөд энэ нь туршилт хийхэд тохиромжтой. Хэрэв та над шиг физик зөөвөрлөгчтэй холбоотой асуудалд санаа зовохгүй, харин файл, дискний дүрс дээр туршиж үзэх санааг гаргасан бол би шууд хэлье: энэ нь ажиллахгүй болно. Ийм "диск" форматлах үед Линукс дахин файл үүсгэх бөгөөд ашиглагдаагүй бүх салбарууд тэгээр дүүрнэ.

Харамсалтай нь Linux үйлдлийн системтэй машины хувьд би тагтан дээр хэвтэж буй Raspberry Pi 3 дээр цаг агаарын станц ашиглах шаардлагатай болсон. Тэнд санах ой тийм ч их биш тул бид том файлуудыг нуухгүй. Бид өөрсдийгөө дээд тал нь 10 мегабайтаар хязгаарладаг. Хэт жижиг файлуудыг нуух нь утгагүй юм: хэрэгсэл нь өгөгдлийг 4 КБ кластерт диск рүү бичдэг. Тиймээс, доор бид өөрсдийгөө 3 кб файлаар хязгаарлах болно - энэ нь нэг кластерт багтах болно.

Бид флаш дискийг үе шаттайгаар шоолж, далд мэдээллийг унших боломжтой эсэхийг шат бүрийн дараа шалгана.

  1. 16 KB кластерын хэмжээтэй FAT16 форматаар хурдан форматлах. Windows 7 нь файлын системгүй флаш дискийг хийхийг санал болгож буй зүйл юм.
  2. Флэш дискээ бүх төрлийн хог хаягдлаар 50% дүүргэнэ.
  3. Флэш дискээ бүх төрлийн хог хаягдлаар 100% дүүргэнэ.
  4. FAT16 форматаар "урт" форматлах (бүгдийг дарж бичих).

Эхний хоёр туршилт нь хүлээж байсанчлан бүрэн ялалтаар өндөрлөв: хэрэгсэл нь флаш дискнээс 10 мегабайт нууц өгөгдлийг амжилттай гаргаж чадсан. Гэхдээ флаш дискийг файлаар дүүргэсний дараа алдаа гарлаа.

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Таны харж байгаагаар ердөө 158 кластер амжилттай шифрлэгдсэн байна (632 килобайт түүхий өгөгдөл нь 636424 байт ачааллыг өгдөг). Эндээс 10 мегабайт авах арга байхгүй нь ойлгомжтой, гэхдээ эдгээр кластеруудын дунд давхардсан тоонууд илт байна. Та ийм аргаар 1 мегабайтыг ч сэргээх боломжгүй. Гэхдээ бид флаш дискийг форматлаж, багтаамжтай болтол нь бичсэний дараа ч гэсэн 3 килобайт нууц мэдээллийг сэргээнэ гэдгээ баталж чадна. Гэсэн хэдий ч туршилтууд ийм флаш дискнээс 120 килобайт урттай файлыг гаргаж авах бүрэн боломжтойг харуулж байна.

Харамсалтай нь сүүлчийн туршилт нь флаш дискийг бүхэлд нь дарж бичсэн болохыг харуулсан.

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Нэг ч кластер амьд үлдээгүй ... Гунигтай, гэхдээ эмгэнэлтэй биш! Форматлахын өмнө флаш диск дээр аль хэдийн файлын системтэй хуваалт үүсгэхийг хичээцгээе. Дашрамд хэлэхэд энэ нь яг ийм форматтай үйлдвэрээс ирсэн тул бид сэжигтэй зүйл хийхгүй байна.
Флэш диск дээрх боломжтой зай бага зэрэг буурсан байх төлөвтэй байна.

Мөн бүрэн дүүрэн диск дээр 10 мегабайтыг нуух боломжгүй гэж нэлээд хүлээгдэж байна. Харин одоо амжилттай тайлагдсан кластеруудын тоо хоёр дахин нэмэгджээ!

Total clusters read: 250752, decrypted: 405

Харамсалтай нь, нэг мегабайтыг хэсэг хэсгээр нь цуглуулах боломжгүй, гэхдээ хоёр зуун килобайт хялбар байдаг.

За, сүүлийн дөрөв дэх шалгалтын тухай мэдээ энэ удаад баяртай байна: ийм флаш дискийг бүрэн форматлах нь бүх мэдээллийг устгахад хүргэсэнгүй! 4 килобайт нууц өгөгдөл нь ашиглагдаагүй орон зайд бүрэн нийцдэг.

Туршилтын хураангуй хүснэгт:

Өнгөрсөн файлуудын стеганографи: өгөгдлийг салбаруудад шууд нуух

Бага зэрэг онол: чөлөөт орон зай ба ашиглагдаагүй салбаруудын тухай

Хэрэв та хатуу дискээ хуваалт болгон хувааж байсан бол дискэн дээрх бүх сул зайг хуваарилах нь үргэлж боломжгүй байдаг гэдгийг та анзаарсан байх. Эхний хэсэг нь үргэлж зарим доголоор эхэлдэг (ихэвчлэн 1 мегабайт буюу 2048 салбар). Сүүлийн хэсгийн ард ашиглагдаагүй салбаруудын жижиг "сүүл" үлдсэн байдаг. Мөн заримдаа ховорхон ч гэсэн хэсгүүдийн хооронд цоорхой байдаг.

Өөрөөр хэлбэл, дискэн дээр хэвийн ажиллах үед хандах боломжгүй секторууд байдаг боловч эдгээр секторууд руу өгөгдөл бичиж болно! Энэ нь бас уншина гэсэн үг. Мөн дискний эхэнд хоосон хэсэгт байрлах хуваалтын хүснэгт болон ачаалагч код байгаа тул тохируулсан.

Хэсэгүүдээс түр завсарлаад дискийг шувууны нүдээр харцгаая. Энд бид диск дээрх хоосон хуваалттай байна. Дотор нь файлын системийг үүсгэцгээе. Диск дээрх зарим секторууд арилгаагүй хэвээр байна гэж бид хэлж чадах уу?

E-e-e - бөмбөрийн өнхрөх! Хариулт нь бараг үргэлж тийм байх болно! Үнэн хэрэгтээ ихэнх тохиолдолд файлын системийг бий болгох нь зөвхөн цөөн хэдэн блок үйлчилгээний мэдээллийг диск рүү бичихэд хүргэдэг бөгөөд өөрөөр хэлбэл хуваалтын агуулга өөрчлөгддөггүй.

Мөн түүнчлэн - цэвэр эмпирик байдлаар бид файлын систем нь сүүлийн салбар хүртэл түүнд хуваарилагдсан бүх зайг үргэлж эзэлж чадахгүй гэж бид үзэж болно. Жишээлбэл, 16 килобайт кластерын хэмжээтэй FAT64 файлын систем нь 64 килобайтаас ихгүй хэмжээтэй хуваалтыг бүрэн эзэлж чадахгүй нь ойлгомжтой. Ийм хэсгийн төгсгөлд хэрэглэгчийн өгөгдлийг хадгалах боломжгүй хэд хэдэн салбаруудын "сүүл" байх ёстой. Гэсэн хэдий ч энэ таамаглалыг туршилтаар батлах боломжгүй байв.

Тиймээс, стеганограммыг ашиглах боломжтой зайг нэмэгдүүлэхийн тулд та илүү том кластер хэмжээтэй файлын системийг ашиглах хэрэгтэй. Та мөн энэ нь шаардлагагүй байсан ч гэсэн хуваалт үүсгэж болно (жишээ нь флаш диск дээр). Хоосон хэсгүүдийг үүсгэх эсвэл хуваарилагдаагүй газрыг орхих шаардлагагүй - энэ нь сонирхсон иргэдийн анхаарлыг татах болно.

Туршилт хийх хэрэгсэл

Та уг хэрэгслийн эх код руу хүрч болно энд

Үүнийг бүтээхийн тулд танд Qt 5.0 буюу түүнээс дээш хувилбар болон OpenSSL хэрэгтэй болно. Хэрэв ямар нэг зүйл ажиллахгүй бол та steganodisk.pro файлыг засах хэрэгтэй болж магадгүй.

Та кластерын хэмжээг 4 КБ-аас 512 байт болгон өөрчилж болно (secretfile.h дээр). Үүний зэрэгцээ үйлчилгээний мэдээллийн өртөг нэмэгдэх болно: толгой ба шалгах нийлбэр нь тогтмол 68 байт эзэлдэг.

Мэдээжийн хэрэг та уг хэрэгслийг үндсэн хэрэглэгчийн эрхээр, болгоомжтой ажиллуулах хэрэгтэй. Заасан файл эсвэл төхөөрөмжийг дарж бичихээс өмнө асуулт асуухгүй!

Сайхан амраарай.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх