starcrypto/crypto.go

172 lines
3.2 KiB
Go
Raw Normal View History

2020-07-20 11:16:23 +08:00
package starcrypto
import (
"crypto/rand"
"encoding/binary"
"encoding/hex"
"io"
"os"
2020-12-21 17:34:07 +08:00
)
2020-07-20 11:16:23 +08:00
func String(bstr []byte) string {
return hex.EncodeToString(bstr)
}
func VicqueEncodeV1(srcdata []byte, key string) []byte {
var keys []int
2024-03-10 13:04:26 +08:00
var randCode1, randCode2 uint8
2020-07-20 11:16:23 +08:00
data := make([]byte, len(srcdata))
copy(data, srcdata)
2024-03-10 13:04:26 +08:00
binary.Read(rand.Reader, binary.LittleEndian, &randCode1)
binary.Read(rand.Reader, binary.LittleEndian, &randCode2)
keys = append(keys, len(key)+int(randCode1))
2020-07-20 11:16:23 +08:00
lens := len(data)
for _, v := range key {
2024-03-10 13:04:26 +08:00
keys = append(keys, int(byte(v))+int(randCode1)-int(randCode2))
2020-07-20 11:16:23 +08:00
}
lenkey := len(keys)
for k, v := range data {
if k == lens/2 {
break
}
nv := int(v)
t := 0
if k%2 == 0 {
nv += keys[k%lenkey]
if nv > 255 {
nv -= 256
}
t = int(data[lens-1-k])
t += keys[k%lenkey]
if t > 255 {
t -= 256
}
} else {
nv -= keys[k%lenkey]
if nv < 0 {
nv += 256
}
t = int(data[lens-1-k])
t -= keys[k%lenkey]
if t > 255 {
t += 256
}
}
data[k] = byte(t)
data[lens-1-k] = byte(nv)
}
2024-03-10 13:04:26 +08:00
data = append(data, byte(randCode1), byte(randCode2))
2020-07-20 11:16:23 +08:00
return data
}
func VicqueDecodeV1(srcdata []byte, key string) []byte {
var keys []int
2024-03-10 13:04:26 +08:00
var randCode1, randCode2 int
2020-07-20 11:16:23 +08:00
data := make([]byte, len(srcdata))
copy(data, srcdata)
lens := len(data)
2024-03-10 13:04:26 +08:00
randCode1 = int(data[lens-2])
randCode2 = int(data[lens-1])
keys = append(keys, len(key)+int(randCode1))
2020-07-20 11:16:23 +08:00
for _, v := range key {
2024-03-10 13:04:26 +08:00
keys = append(keys, int(byte(v))+int(randCode1)-int(randCode2))
2020-07-20 11:16:23 +08:00
}
lenkey := len(keys)
lens -= 2
for k, v := range data {
if k == lens/2 {
break
}
nv := int(v)
t := 0
if k%2 == 0 {
nv -= keys[k%lenkey]
if nv < 0 {
nv += 256
}
t = int(data[lens-1-k])
t -= keys[k%lenkey]
if t > 255 {
t += 256
}
} else {
nv += keys[k%lenkey]
if nv > 255 {
nv -= 256
}
t = int(data[lens-1-k])
t += keys[k%lenkey]
if t > 255 {
t -= 256
}
}
data[k] = byte(t)
data[lens-1-k] = byte(nv)
}
return data[:lens]
}
func VicqueEncodeV1File(src, dst, pwd string, shell func(float64)) error {
fpsrc, err := os.Open(src)
if err != nil {
return err
}
defer fpsrc.Close()
stat, _ := os.Stat(src)
filebig := float64(stat.Size())
2020-12-21 17:34:07 +08:00
var sum int64
2020-07-20 11:16:23 +08:00
defer fpsrc.Close()
fpdst, err := os.Create(dst)
if err != nil {
return err
}
defer fpdst.Close()
for {
buf := make([]byte, 1048576)
n, err := fpsrc.Read(buf)
if err != nil {
if err == io.EOF {
break
}
return err
}
2020-12-21 17:34:07 +08:00
sum += int64(n)
2020-07-20 11:16:23 +08:00
go shell(float64(sum) / filebig * 100)
data := VicqueEncodeV1(buf[0:n], pwd)
fpdst.Write(data)
}
return nil
}
func VicqueDecodeV1File(src, dst, pwd string, shell func(float64)) error {
fpsrc, err := os.Open(src)
if err != nil {
return err
}
defer fpsrc.Close()
stat, _ := os.Stat(src)
filebig := float64(stat.Size())
2020-12-21 17:34:07 +08:00
var sum int64
2020-07-20 11:16:23 +08:00
defer fpsrc.Close()
fpdst, err := os.Create(dst)
if err != nil {
return err
}
defer fpdst.Close()
for {
buf := make([]byte, 1048578)
n, err := fpsrc.Read(buf)
if err != nil {
if err == io.EOF {
break
}
return err
}
2020-12-21 17:34:07 +08:00
sum += int64(n)
2020-07-20 11:16:23 +08:00
go shell(float64(sum) / filebig * 100)
data := VicqueDecodeV1(buf[0:n], pwd)
fpdst.Write(data)
}
return nil
}