107 lines
2.5 KiB
Go
107 lines
2.5 KiB
Go
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]
|
||
}
|
||
}
|
||
}
|