使用 golang 编写,源代码如下。

package main
 
import (
    "bufio"
    "fmt"
    "io/ioutil"
    "os"
    "runtime"
    "strings"
)
 
var fg string
var secKey byte
var decPath string
var dPath string
var workCount = 0  //工作中工人数
var maxWorker = 32 //最大工人数
var mainWorkerDone = false
var getFileWork = make(chan string) //分配工作
var workDone = make(chan bool)      //是否结束工作
 
func main() {
    //var rootpath string
    fmt.Println("说明:文件夹路径最后请勿带斜杠,请确认保存路径为已存在空文件夹!")
    fmt.Println("请输入待解密图片文件夹路径:")
    dscanner := bufio.NewScanner(os.Stdin) //用此方法可以获取带空格路径
    dscanner.Scan()
    dPath = dscanner.Text()
    fmt.Println("请输入待解密图片保存路径:")
    secscanner := bufio.NewScanner(os.Stdin)
    secscanner.Scan()
    decPath = secscanner.Text()
    systype := runtime.GOOS //获取操作系统类型
    if systype == "windows" {
        fg = "\\"
    } else {
        fg = "/"
    }
    secKey = getkey(dPath)
    fmt.Println(secKey)
    go getFileList()
    waitForWorkers()
}
 
func getkey(p string) (key byte) { //获取解密key
    dir_list, err := ioutil.ReadDir(p)
    if err == nil {
        for _, v := range dir_list { //循环查找文件,需要找到jpg加密特征码
            if v.IsDir() == false { //判断是否是文件夹
                fio, err := ioutil.ReadFile(p + fg + v.Name())
                if fio[0] == fio[2] && err == nil {
                    key = fio[0] ^ '\xFF' //异或运算获取解密key
                    return key
                }
            }
        }
    }
    return
}
 
func decodepic() { //解密图片
    fname := <-getFileWork //向通道获取任务
    fpath := dPath + fg + fname
    ffio, err := ioutil.ReadFile(fpath)
    if err == nil {
        for i, val := range ffio {
            ffio[i] = val ^ secKey
        }
        var hz string
        if ffio[0] == '\xFF' && ffio[1] == '\xD8' { //jpg格式
            hz = "jpg"
        } else if ffio[0] == '\x89' && ffio[1] == '\x50' { //PNG格式
            hz = "png"
        } else if ffio[0] == '\x42' && ffio[1] == '\x4D' { //bmp格式
            hz = "bmp"
        } else if ffio[0] == '\x47' && ffio[1] == '\x49' { //gif格式
            hz = "gif"
        } else { //未知格式
            hz = "dat"
        }
        fname := strings.TrimRight(fname, "dat") + hz //生成新的名称
        decf := decPath + fg + fname
        ioutil.WriteFile(decf, ffio, 0666)
        //reFileName <- decf //向通道反馈解密的文件名
        fmt.Println(decf)
        workDone <- true //报告任务已经完成
    }
}
 
func waitForWorkers() { //任务循环监听进程
    for {
        if workCount < maxWorker { //布置新工作
            go decodepic()
            workCount++ //加个工人
        }
        select {
        case <-workDone:
            workCount-- //工人减少
        }
        if mainWorkerDone == true && workCount == 0 { //所有工作完成,退出循环
            return
        }
    }
}
 
func getFileList() { //任务发布者,根据获取的文件列表发送任务
    flist, err := ioutil.ReadDir(dPath)
    if err == nil {
        for _, ff := range flist {
            if ff.IsDir() == false && strings.Contains(ff.Name(), ".dat") == true {
                //t := dPath+fg+ff.Name()
                getFileWork <- ff.Name()
            }
        }
        mainWorkerDone = true //主任务结束标志
    }
}

https://www.52pojie.cn/forum.php?mod=viewthread&tid=1438829