ホームページ >バックエンド開発 >Golang >golangの画像を非表示にする

golangの画像を非表示にする

王林
王林オリジナル
2023-05-16 09:13:37759ブラウズ

現代社会ではデジタル技術の発展が進み、オンラインの世界における個人情報保護の課題はますます重要になっています。データのプライバシーを保護するために、人々はさまざまな暗号化方式を模索していますが、その中でも一般的な暗号化方式が画像隠蔽技術です。 Golang は効率的なプログラミング言語として、画像隠蔽テクノロジーの実装にも使用できます。

画像の非表示とは何ですか?

いわゆる画像隠蔽とは、1 つの画像内に別の画像または情報を隠し、外部のユーザーが外部の画像のみを参照し、隠された画像または情報には目をつぶることができるようにすることです。この方法では、データのプライバシーを十分に保護し、データのセキュリティをある程度強化できます。

Golang の画像非表示原理

Golang は効率的なプログラミング言語として、Web サイトのバックエンド プログラムを作成するためだけに使用されるわけではありません。 Golangの画像処理ライブラリ「image」は、画像の切り抜き、回転、拡大縮小、色調整など、画像に対してさまざまな処理を行うことができる豊富な画像処理機能を提供しています。

画像隠蔽テクノロジーは基本的に、ある画像を別の画像に埋め込みます。埋め込みプロセスは 2 つのステップに分かれています。まず、非表示にする画像をバイナリ文字列に変換し、次にそのバイナリ文字列をターゲット画像に埋め込みます。埋め込みの際、ターゲット画像のピクセルデータをキャリアとして使用し、ピクセルデータ内の特定のビットに隠蔽する情報を順番に格納できます。この隠された情報は、別の画像、テキスト、音声などです。受信者が画像を取得すると、画像に隠されている情報を解読できます。

画像非表示の実装

Golang が提供する画像パッケージを使用して画像非表示を実装できます。実装する手順は次のとおりです。

ステップ 1: ターゲット イメージを読み取る

Golang のイメージ パッケージの Decode 関数を使用して、イメージ ファイルを Go 言語の Image オブジェクトにデコードします。この例では、この関数を使用してターゲット画像を読み取ります。

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
}

ステップ 2: 非表示にする画像をバイナリ文字列に変換する

Golang の io/ioutil パッケージの ReadFile 関数を使用して、非表示にする画像を読み取り、バイナリに変換できます。弦。

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

ステップ 3: データを非表示にする

バイナリ データを非表示にするには、新しい Image オブジェクトを作成し、そのピクセル データを変更する必要があります。通常、各ピクセルは 4 バイト (32 ビット) を占めるため、各ピクセルの最後のビットを使用してデータを保存できます。例えば、非表示にしたいデータが「01100101」の場合、対象画像のピクセルに格納することができますが、具体的な方法としては、ピクセルの最後のビットを0または1に設定してデータを格納します(最後のビットは01100101であるため)。 1 ピクセルはビットなので、8 ピクセルで 1 バイトのデータを保存できます。

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
}

ステップ 4: 隠しデータを含む新しい画像を保存する

新しい画像を隠しデータとともに保存するには、Golang の画像パッケージの Encode 機能を使用します。

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
}

完全なコード:

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
}

上記は、Golang で画像隠蔽テクノロジを実装するための手順とコードです。なお、この画像隠蔽技術はデータの安全性を完全に保証するものではなく、あくまで暗号化方式です。データのプライバシーをより厳密に保護する必要がある場合は、他の暗号化方法を検討する必要があります。

概要

Golang は効率的なプログラミング言語として、優れた画像処理機能を備えています。この記事では、データのプライバシーをある程度確保できる画像隠蔽技術を Golang を使用して実装します。このテクノロジーはデータのセキュリティを完全に保証するものではないため、実際のアプリケーションでは、データのプライバシーを保護するためにさらに多くの暗号化方法が必要になることに注意してください。

以上がgolangの画像を非表示にするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。