打印
[实用程序源码及工具软件]

Go语言调用动态链接库DLL例程源码(独家在21ic发表)

[复制链接]
138|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2023-9-19 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2023-9-20 09:44 编辑
package main

import (
        "fmt"
        "os"
        "runtime"
        "strings"
        "syscall"
        "unsafe"
)

var PEA256Init *syscall.LazyProc
var PEA256Open *syscall.LazyProc
var PEA256Close *syscall.LazyProc
var PEA256EncryptUserKey *syscall.LazyProc
var PEA256DecryptUserKey *syscall.LazyProc
var PEA256EncryptBytes *syscall.LazyProc
var PEA256DecryptBytes *syscall.LazyProc
var PEA256EncryptBytesEx *syscall.LazyProc
var PEA256DecryptBytesEx *syscall.LazyProc
var PEA256Test *syscall.LazyProc
var PEA256Version *syscall.LazyProc
var PEA256Error *syscall.LazyProc

func init() { //golang初始化
}

func main() {
        //PEA256dll := syscall.NewLazyDLL("D:\\libpea256x64\\libpea256x64.dll")
        PEA256dll := syscall.NewLazyDLL("D:\\PEA256COM\\x64\\Release\\libpea256x64.dll")
        PEA256Init = PEA256dll.NewProc("PEA256Init")
        PEA256Open = PEA256dll.NewProc("PEA256Open")
        PEA256Close = PEA256dll.NewProc("PEA256Close")
        PEA256EncryptUserKey = PEA256dll.NewProc("PEA256EncryptUserKey")
        PEA256DecryptUserKey = PEA256dll.NewProc("PEA256DecryptUserKey")
        PEA256EncryptBytes = PEA256dll.NewProc("PEA256EncryptBytes")
        PEA256DecryptBytes = PEA256dll.NewProc("PEA256DecryptBytes")
        PEA256EncryptBytesEx = PEA256dll.NewProc("PEA256EncryptBytesEx")
        PEA256DecryptBytesEx = PEA256dll.NewProc("PEA256DecryptBytesEx")
        PEA256Test = PEA256dll.NewProc("PEA256Test")
        PEA256Version = PEA256dll.NewProc("PEA256Version")
        PEA256Error = PEA256dll.NewProc("PEA256Error")
        ret, _, _ := PEA256Init.Call() //必须初始化,并且只能一次
        PEA256Version.Call()
        if ret != 0 {
                PEA256Test.Call()
                argv := os.Args
                argc := len(argv)
                switch argc {
                case 2: //pea256golang pea256.txt
                        CommandExec(argv[1], "") //默认.KEY文件为pea256.txt.pea.key
                        //fmt.Printf(argv[1])
                case 3: //pea256golang pea256.txt pea256.txt.pea.key
                        CommandExec(argv[1], argv[2])
                default: //测试
                        handle, _, _ := PEA256Open.Call()
                        if handle != 0 {
                                Array := make([]byte, 4)
                                ArrayEncrypt := make([]byte, 4)
                                ArrayDecrypt := make([]byte, 4)
                                for i := 0; i < 4; i++ {
                                        Array[i] = uint8(i)
                                        ArrayEncrypt[i] = uint8(i)
                                }
                                nilPtr := []byte{0}
                                keyname := "123"
                                gokeyname := []byte(keyname)
                                subkey, _, _ := PEA256EncryptUserKey.Call(handle, uintptr(unsafe.Pointer(&gokeyname[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])))
                                subkey, _, _ = PEA256EncryptBytes.Call(handle, uintptr(unsafe.Pointer(&Array[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", Array[i])
                                }
                                fmt.Println("")
                                keyname = "123"
                                gokeyname = []byte(keyname)
                                subkey, _, _ = PEA256DecryptUserKey.Call(handle, uintptr(unsafe.Pointer(&gokeyname[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])))
                                subkey, _, _ = PEA256DecryptBytes.Call(handle, uintptr(unsafe.Pointer(&Array[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", Array[i])
                                }
                                fmt.Println("")
                                var sum uint
                                sum = 0
                                for i := 0; i < 4; i++ {
                                        sum ^= uint(i) ^ uint(Array[i]) //简单的异或和校验
                                }
                                if sum != 0 {
                                        fmt.Println("加解密1错误!!!")
                                } else {
                                        fmt.Println("加解密1正确!!!")
                                }
                                keybuff := "0123456789ABCDEF0123456789ABCDEF"
                                gokeybuff := []byte(keybuff)
                                subkey, _, _ = PEA256EncryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gokeybuff[0])), uintptr(unsafe.Pointer(&nilPtr[0])))
                                subkey, _, _ = PEA256EncryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayEncrypt[i])
                                }
                                fmt.Println("")
                                subkey, _, _ = PEA256DecryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gokeybuff[0])), uintptr(unsafe.Pointer(&nilPtr[0])))
                                subkey, _, _ = PEA256DecryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayEncrypt[i])
                                }
                                fmt.Println("")
                                sum = 0
                                for i := 0; i < 4; i++ {
                                        sum ^= uint(i) ^ uint(ArrayEncrypt[i]) //简单的异或和校验
                                }
                                if sum != 0 {
                                        fmt.Println("加解密2错误!!!")
                                } else {
                                        fmt.Println("加解密2正确!!!")
                                }
                                filename := "D:\\Java-eclipse-workspace\\PEA256COMJavax64\\123.PEA.KEY\n" //留出文件名结尾符
                                gofilename := []byte(filename)
                                gofilename[len(filename)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                                subkey, _, _ = PEA256EncryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gofilename[0])))
                                subkey, _, _ = PEA256EncryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(unsafe.Pointer(&ArrayDecrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayDecrypt[i])
                                }
                                fmt.Println("")
                                subkey, _, _ = PEA256DecryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gofilename[0])))
                                subkey, _, _ = PEA256DecryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayDecrypt[0])), uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayEncrypt[i])
                                }
                                fmt.Println("")
                                sum = 0
                                for i := 0; i < 4; i++ {
                                        sum ^= uint(i) ^ uint(ArrayEncrypt[i]) //简单的异或和校验
                                }
                                if sum != 0 {
                                        fmt.Println("加解密3错误!!!")
                                } else {
                                        fmt.Println("加解密3正确!!!")
                                }
                                //filename = "D:\\libpea256x86\\安装最新说明.docx\n" //留出文件名结尾符,中文出错
                                filename = "D:\\libpea256x86\\libpea256x86.dll\n" //留出文件名结尾符,中文出错
                                gofilename = []byte(filename)
                                gofilename[len(filename)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                                subkey, _, _ = PEA256EncryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gofilename[0])))
                                subkey, _, _ = PEA256EncryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(unsafe.Pointer(&ArrayDecrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayDecrypt[i])
                                }
                                fmt.Println("")
                                subkey, _, _ = PEA256DecryptUserKey.Call(handle, uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&nilPtr[0])), uintptr(unsafe.Pointer(&gofilename[0])))
                                subkey, _, _ = PEA256DecryptBytesEx.Call(handle, uintptr(unsafe.Pointer(&ArrayDecrypt[0])), uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(4), uintptr(subkey))
                                for i := 0; i < 4; i++ {
                                        fmt.Printf(" %02X", ArrayEncrypt[i])
                                }
                                fmt.Println("")
                                sum = 0
                                for i := 0; i < 4; i++ {
                                        sum ^= uint(i) ^ uint(ArrayEncrypt[i]) //简单的异或和校验
                                }
                                if sum != 0 {
                                        fmt.Println("加解密4错误!!!")
                                } else {
                                        fmt.Println("加解密4正确!!!")
                                }
                                PEA256Close.Call(uintptr(handle))
                        }
                        PEA256Test.Call()
                        PEA256Error.Call()
                        fmt.Println("PEA256COM!!!")
                }
        } else {
                fmt.Println("Registration Failed!!!")
        }
}

func Exist(path string) bool {
        _, err := os.Lstat(path)
        return !os.IsNotExist(err)
}

func CommandExec(filename string, keyname string) {
        filename = strings.ToUpper(filename)
        keyname = strings.ToUpper(keyname)
        if Exist(filename) { //明文或密文存在
                if filename[len(filename)-4:] != ".PEA" { //明文
                        if keyname == "" {
                                keyname = filename + ".PEA.KEY"
                        }
                        FileEncrypt(filename, keyname) //文件加密
                } else { //密文,必须有.KEY文件或字符串
                        if keyname == "" {
                                keyname = filename + ".KEY"
                        }
                        FileDecrypt(filename, keyname) //文件解密
                }
        }
}

func FileEncrypt(filename string, keyname string) { //文件加密
        handle, _, _ := PEA256Open.Call()
        if handle != 0 {
                var gokeyname []byte
                if keyname == "" {
                        gokeyname = []byte{0}
                } else {
                        keystr := keyname + " "
                        gokeyname = []byte(keystr)
                        gokeyname[len(keystr)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                }
                gokeybuff := []byte{0}
                var gofilename []byte
                if filename == "" {
                        gofilename = []byte{0}
                } else {
                        filestr := filename + " "
                        gofilename = []byte(filestr)
                        gofilename[len(filestr)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                }
                subkey, _, _ := PEA256EncryptUserKey.Call(handle, uintptr(unsafe.Pointer(&gokeyname[0])), uintptr(unsafe.Pointer(&gokeybuff[0])), uintptr(unsafe.Pointer(&gofilename[0])))
                peaname := filename + ".PEA"          //密文文件后缀加上".PEA"
                ArrayEncrypt := make([]byte, 0x80000) //加密数组
                reader, _ := os.Open(filename)        //明文读文件
                defer reader.Close()
                writer, _ := os.Create(peaname) //密文写文件
                defer writer.Close()
                for {
                        gcount, _ := reader.Read(ArrayEncrypt)
                        if 0 == gcount {
                                break
                        }
                        subkey, _, _ = PEA256EncryptBytes.Call(handle, uintptr(unsafe.Pointer(&ArrayEncrypt[0])), uintptr(gcount), uintptr(subkey))
                        writer.Write(ArrayEncrypt[:gcount])
                        runtime.Gosched()
                }
                fmt.Println("FileEncrypt->" + filename + "=>" + peaname + "=>" + keyname)
                PEA256Close.Call(handle)
        }
}
func FileDecrypt(peaname string, keyname string) { //文件解密
        handle, _, _ := PEA256Open.Call()
        if handle != 0 {
                var gokeyname []byte
                if keyname == "" {
                        gokeyname = []byte{0}
                } else {
                        keystr := keyname + " "
                        gokeyname = []byte(keystr)
                        gokeyname[len(keystr)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                }
                gokeybuff := []byte{0}
                var gopeaname []byte
                if peaname == "" {
                        gopeaname = []byte{0}
                } else {
                        peastr := peaname + " "
                        gopeaname = []byte(peastr)
                        gopeaname[len(peastr)-1] = 0 //去掉文件名结尾符,golang的问题,否则找不到文件
                }
                subkey, _, _ := PEA256DecryptUserKey.Call(handle, uintptr(unsafe.Pointer(&gokeyname[0])), uintptr(unsafe.Pointer(&gokeybuff[0])), uintptr(unsafe.Pointer(&gopeaname[0])))
                filename := peaname[0 : len(peaname)-4] //明文文件后缀去掉".PEA"
                ArrayDecrypt := make([]byte, 0x80000)   //解密数组
                reader, _ := os.Open(peaname)           //密文读文件
                defer reader.Close()
                writer, _ := os.Create(filename) //明文写文件
                defer writer.Close()
                for {
                        gcount, _ := reader.Read(ArrayDecrypt)
                        if 0 == gcount {
                                break
                        }
                        subkey, _, _ = PEA256DecryptBytes.Call(handle, uintptr(unsafe.Pointer(&ArrayDecrypt[0])), uintptr(gcount), uintptr(subkey))
                        writer.Write(ArrayDecrypt[:gcount])
                        runtime.Gosched()
                }
                fmt.Println("FileDecrypt->" + peaname + "=>" + filename + "=>" + keyname)
                PEA256Close.Call(handle)
        }
}


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1538

主题

21697

帖子

506

粉丝