Files
schisandra-album-cloud-micr…/common/img_encrypt/img_encrypt_test.go
2025-03-06 00:08:16 +08:00

107 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"image"
"image/draw"
"image/png"
"log"
"os"
"testing"
)
func TestImgEncrypt(t *testing.T) {
// 1. 读取并强制转换为RGBA
inputFile, err := os.Open("E:\\Go_WorkSpace\\schisandra-album-cloud-microservices\\common\\img_encrypt\\input.png")
if err != nil {
log.Fatal("打开文件失败:", err)
}
defer inputFile.Close()
srcImg, err := png.Decode(inputFile)
if err != nil {
log.Fatal("解码失败:", err)
}
bounds := srcImg.Bounds()
rgba := image.NewRGBA(bounds)
draw.Draw(rgba, bounds, srcImg, bounds.Min, draw.Src)
// 2. 安全加密(处理有效像素区)
key := []byte{0x1F, 0x3A, 0x7B, 0x9C} // 示例密钥推荐长度4/8/16
secureXor(rgba, key)
// 3. 保存加密图像(禁用压缩)
outputFile, err := os.Create("encrypted.png")
if err != nil {
log.Fatal("创建文件失败:", err)
}
defer outputFile.Close()
encoder := png.Encoder{CompressionLevel: png.NoCompression}
if err := encoder.Encode(outputFile, rgba); err != nil {
log.Fatal("保存失败:", err)
}
}
func TestImgDecrypt(t *testing.T) {
// 1. 读取加密图像
inputFile, err := os.Open("E:\\Go_WorkSpace\\schisandra-album-cloud-microservices\\common\\img_encrypt\\encrypted.png")
if err != nil {
log.Fatal("打开加密文件失败:", err)
}
defer inputFile.Close()
encImg, err := png.Decode(inputFile)
if err != nil {
log.Fatal("解码失败:", err)
}
// 2. 转换为RGBA
bounds := encImg.Bounds()
rgba := image.NewRGBA(bounds)
draw.Draw(rgba, bounds, encImg, bounds.Min, draw.Src)
// 3. 解密(使用相同密钥)
key := []byte{0x1F, 0x3A, 0x7B, 0x9C} // 必须与加密一致
secureXor(rgba, key)
// 4. 保存解密结果
outputFile, err := os.Create("decrypted.png")
if err != nil {
log.Fatal("创建解密文件失败:", err)
}
defer outputFile.Close()
encoder := png.Encoder{CompressionLevel: png.NoCompression}
if err := encoder.Encode(outputFile, rgba); err != nil {
log.Fatal("保存失败:", err)
}
}
// 通用加密/解密函数
// 安全加密函数
func secureXor(img *image.RGBA, key []byte) {
keyLen := len(key)
if keyLen == 0 {
log.Fatal("密钥不能为空")
}
bounds := img.Bounds()
data := img.Pix
stride := img.Stride
width := bounds.Dx() * 4 // 每行实际需要的字节数
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
rowStart := (y - bounds.Min.Y) * stride
// 严格限定处理范围为有效像素区
end := rowStart + width
if end > len(data) {
end = len(data)
}
for pos := rowStart; pos < end; pos++ {
data[pos] ^= key[pos%keyLen]
}
}
}