معرف التجربة: 003
أداة لإخفاء البيانات في الصور
مفاهيميإخفاء بيانات الصور باستخدام البت الأقل أهمية (LSB) في Go، بإدراج حمولة يسبقها طولها في القناة الحمراء لبكسلات PNG.
الهدف
إنشاء قناة خفية بتعديل أقل بتات بيانات البكسلات أهمية، ثم التحقق من استعادة البيانات الأصلية دون تغيير.
القيود
حجم الحمولة محدود بـ (العرض × الارتفاع) / 8 بايت ناقص ترويسة الطول البالغة 4 بايت. لا يقاوم إعادة الترميز بصيغة JPEG أو تغيير حجم الصورة.
- Go
- التشفير
- معالجة الصور
الكود المصدري · اللغة الأصليةsrc/main.go
1package main23import (4 "encoding/binary"5 "fmt"6 "image"7 "image/color"8 "image/png"9 "os"10)1112func embed(img *image.NRGBA, payload []byte) error {13 header := make([]byte, 4)14 binary.BigEndian.PutUint32(header, uint32(len(payload)))15 bits := append(header, payload...)1617 idx := 018 for y := img.Bounds().Min.Y; y < img.Bounds().Max.Y; y++ {19 for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x++ {20 if idx >= len(bits)*8 {21 return nil22 }23 c := img.NRGBAAt(x, y)24 bytePos, bitPos := idx/8, uint(7-idx%8)25 bit := (bits[bytePos] >> bitPos) & 126 c.R = (c.R & 0xFE) | bit27 img.SetNRGBA(x, y, color.NRGBA{R: c.R, G: c.G, B: c.B, A: c.A})28 idx++29 }30 }31 if idx == len(bits)*8 {32 return nil // The payload filled the image exactly.33 }34 return fmt.Errorf("image too small for payload")35}3637func main() {38 f, _ := os.Open("cover.png")39 defer f.Close()40 src, _ := png.Decode(f)4142 dst := image.NewNRGBA(src.Bounds())43 for y := dst.Bounds().Min.Y; y < dst.Bounds().Max.Y; y++ {44 for x := dst.Bounds().Min.X; x < dst.Bounds().Max.X; x++ {45 dst.Set(x, y, src.At(x, y))46 }47 }4849 _ = embed(dst, []byte("HIDDEN_MESSAGE"))5051 out, _ := os.Create("stego.png")52 defer out.Close()53 png.Encode(out, dst)54 fmt.Println("Done — payload embedded into stego.png")55}شفرة للقراءة فقطUTF-8