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)
}
}