gambar golang sorok

王林
王林asal
2023-05-16 09:13:37760semak imbas

Dalam masyarakat moden, teknologi digital terus berkembang, dan isu perlindungan maklumat peribadi dalam dunia dalam talian telah menjadi semakin penting. Untuk melindungi privasi data, orang ramai mencari pelbagai kaedah penyulitan, antaranya teknologi penyembunyian gambar ialah kaedah penyulitan biasa. Golang, sebagai bahasa pengaturcaraan yang cekap, juga boleh digunakan untuk melaksanakan teknologi penyembunyian imej.

Apakah gambar yang disembunyikan?

Apa yang dipanggil penyembunyian gambar adalah untuk menyembunyikan gambar atau maklumat lain dalam satu gambar, supaya pengguna luar hanya dapat melihat gambar luaran dan menutup mata terhadap gambar atau maklumat yang tersembunyi. Kaedah ini boleh melindungi privasi data dengan baik dan meningkatkan keselamatan data pada tahap tertentu.

Prinsip penyembunyian gambar Golang

Golang, sebagai bahasa pengaturcaraan yang cekap, bukan sahaja digunakan untuk menulis program akhir laman web. "Imej" pustaka pemprosesan imej Golang menyediakan pelbagai fungsi pemprosesan imej, yang boleh melakukan pelbagai operasi pemprosesan pada imej, seperti pemangkasan imej, putaran, penskalaan, pelarasan warna, dsb.

Teknologi penyembunyian imej pada asasnya membenamkan satu imej dalam imej lain. Proses pembenaman dibahagikan kepada dua langkah: pertama, tukar imej untuk disembunyikan ke dalam rentetan binari, dan kemudian benamkan rentetan binari ke dalam imej sasaran. Apabila membenamkan, kita boleh menggunakan data piksel imej sasaran sebagai pembawa dan menyimpan maklumat untuk disembunyikan dalam bit tertentu dalam data piksel mengikut turutan. Maklumat tersembunyi ini boleh berupa gambar, teks, audio, dsb. Apabila penerima memperoleh imej, dia boleh menyahsulit maklumat yang tersembunyi di dalamnya.

Sembunyikan gambar

Kita boleh menggunakan pakej imej yang disediakan oleh Golang untuk menyembunyikan gambar. Berikut ialah langkah untuk melaksanakan:

Langkah 1: Baca imej sasaran

Gunakan fungsi Nyahkod pakej imej Golang untuk menyahkod fail imej menjadi objek Imej dalam bahasa Go. Dalam contoh ini, kami akan menggunakan fungsi ini untuk membaca imej sasaran.

func readImage(path string) (image.Image, error) {
    f, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    
    img, _, err := image.Decode(f)
    if err != nil {
        return nil, err
    }
    
    return img, nil
}

Langkah 2: Tukar imej untuk disembunyikan kepada rentetan binari

Kita boleh menggunakan fungsi ReadFile dalam pakej io/ioutil Golang untuk membaca imej yang hendak disembunyikan dan menukarnya kepada Binary rentetan.

func readData(path string) ([]byte, error) {
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return nil, err
    }
    
    return data, nil
}

Langkah 3: Sembunyikan Data

Untuk menyembunyikan data binari, kita perlu mencipta objek Imej baharu dan mengubah suai data pikselnya. Oleh kerana setiap piksel biasanya menduduki empat bait (32 bit), kita boleh menggunakan bit terakhir setiap piksel untuk menyimpan data. Sebagai contoh, jika data yang hendak disembunyikan ialah 01100101, kita boleh menyimpannya dalam piksel imej sasaran Kaedah khusus ialah menetapkan bit terakhir piksel kepada 0 atau 1 untuk menyimpan data (kerana bit terakhir. piksel adalah sedikit, Oleh itu satu bait data dalam 8 piksel boleh disimpan).

func hideData(img image.Image, data []byte) (image.Image, error) {
    bounds := img.Bounds()
    
    newImg := image.NewRGBA(bounds)
    
    idx := 0    
    var r, g, b, a uint32
    
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            r, g, b, a = img.At(x, y).RGBA()
            if idx < len(data)*8 {
                bitIdx := idx % 8
                bits := uint32(data[idx/8])
                mask := uint32(0x00 << bitIdx)
                if bits&(1<<7-bitIdx) > 0 {
                    mask |= uint32(0x01 << bitIdx)
                }
                r = (r & 0xFFFE) | (mask & 0x01)
                g = (g & 0xFFFE) | ((mask >> 1) & 0x01)
                b = (b & 0xFFFE) | ((mask >> 2) & 0x01)
                a = (a & 0xFFFE) | ((mask >> 3) & 0x01)                
            }
            newImg.Set(x, y, color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)})
            idx++
        }
    }
    
    return newImg, nil
}

Langkah 4: Simpan imej baharu dengan data tersembunyi

Untuk menyimpan imej baharu dengan data tersembunyi, gunakan fungsi Pengekodan pakej imej Golang.

func saveImage(path string, img image.Image) error {
    f, err := os.Create(path)
    if err != nil {
        return err
    }
    defer f.Close()
    
    err = png.Encode(f, img)
    if err != nil {
        return err
    }
    
    return nil
}

Kod penuh:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/png"
    "io/ioutil"
    "os"
)

func main() {
    if len(os.Args) < 2 {
        fmt.Println("usage: go run main.go [filename]")
        return
    }
    
    filename := os.Args[1]
    dataPath := "data.png"
    outputPath := "output.png"
    
    fmt.Printf("Reading target image %s...
", filename)
    img, err := readImage(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    
    fmt.Printf("Reading data image %s...
", dataPath)
    data, err := readData(dataPath)
    if err != nil {
        fmt.Println(err)
        return
    }
    
    fmt.Println("Hiding data...")
    newImg, err := hideData(img, data)
    if err != nil {
        fmt.Println(err)
        return
    }
    
    fmt.Printf("Saving image to %s...
", outputPath)
    err = saveImage(outputPath, newImg)
    if err != nil {
        fmt.Println(err)
        return
    }
    
    fmt.Println("Done!")
}

func readImage(path string) (image.Image, error) {
    f, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    
    img, _, err := image.Decode(f)
    if err != nil {
        return nil, err
    }
    
    return img, nil
}

func readData(path string) ([]byte, error) {
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return nil, err
    }
    
    return data, nil
}

func hideData(img image.Image, data []byte) (image.Image, error) {
    bounds := img.Bounds()
    
    newImg := image.NewRGBA(bounds)
    
    idx := 0    
    var r, g, b, a uint32
    
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            r, g, b, a = img.At(x, y).RGBA()
            if idx < len(data)*8 {
                bitIdx := idx % 8
                bits := uint32(data[idx/8])
                mask := uint32(0x00 << bitIdx)
                if bits&(1<<7-bitIdx) > 0 {
                    mask |= uint32(0x01 << bitIdx)
                }
                r = (r & 0xFFFE) | (mask & 0x01)
                g = (g & 0xFFFE) | ((mask >> 1) & 0x01)
                b = (b & 0xFFFE) | ((mask >> 2) & 0x01)
                a = (a & 0xFFFE) | ((mask >> 3) & 0x01)                
            }
            newImg.Set(x, y, color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)})
            idx++
        }
    }
    
    return newImg, nil
}

func saveImage(path string, img image.Image) error {
    f, err := os.Create(path)
    if err != nil {
        return err
    }
    defer f.Close()
    
    err = png.Encode(f, img)
    if err != nil {
        return err
    }
    
    return nil
}

Di atas ialah langkah dan kod untuk Golang melaksanakan teknologi penyembunyian imej. Perlu diingatkan bahawa teknologi penyembunyian imej ini tidak menjamin keselamatan data sepenuhnya, ia hanyalah kaedah penyulitan. Jika privasi data ingin dilindungi dengan lebih ketat, kaedah penyulitan lain perlu dipertimbangkan.

Ringkasan

Golang ialah bahasa pengaturcaraan yang cekap dengan keupayaan pemprosesan imej yang sangat baik. Dalam artikel ini, kami menggunakan Golang untuk melaksanakan teknologi penyembunyian imej, yang boleh memastikan privasi data pada tahap tertentu. Perlu diingat bahawa teknologi ini tidak menjamin keselamatan data sepenuhnya, jadi dalam aplikasi praktikal, lebih banyak kaedah penyulitan diperlukan untuk melindungi privasi data.

Atas ialah kandungan terperinci gambar golang sorok. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn