202 lines
3.4 KiB
Go
202 lines
3.4 KiB
Go
|
|
package legacy
|
||
|
|
|
||
|
|
import (
|
||
|
|
"crypto/rand"
|
||
|
|
"io"
|
||
|
|
"os"
|
||
|
|
)
|
||
|
|
|
||
|
|
func VicqueEncodeV1(srcdata []byte, key string) []byte {
|
||
|
|
var keys []int
|
||
|
|
var randCode [2]byte
|
||
|
|
_, _ = io.ReadFull(rand.Reader, randCode[:])
|
||
|
|
|
||
|
|
data := make([]byte, len(srcdata))
|
||
|
|
copy(data, srcdata)
|
||
|
|
|
||
|
|
randCode1 := int(randCode[0])
|
||
|
|
randCode2 := int(randCode[1])
|
||
|
|
keys = append(keys, len(key)+randCode1)
|
||
|
|
for _, v := range key {
|
||
|
|
keys = append(keys, int(byte(v))+randCode1-randCode2)
|
||
|
|
}
|
||
|
|
|
||
|
|
lens := len(data)
|
||
|
|
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 < 0 {
|
||
|
|
t += 256
|
||
|
|
}
|
||
|
|
}
|
||
|
|
data[k] = byte(t)
|
||
|
|
data[lens-1-k] = byte(nv)
|
||
|
|
}
|
||
|
|
data = append(data, randCode[0], randCode[1])
|
||
|
|
return data
|
||
|
|
}
|
||
|
|
|
||
|
|
func VicqueDecodeV1(srcdata []byte, key string) []byte {
|
||
|
|
if len(srcdata) < 2 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
data := make([]byte, len(srcdata))
|
||
|
|
copy(data, srcdata)
|
||
|
|
lens := len(data)
|
||
|
|
|
||
|
|
randCode1 := int(data[lens-2])
|
||
|
|
randCode2 := int(data[lens-1])
|
||
|
|
|
||
|
|
keys := []int{len(key) + randCode1}
|
||
|
|
for _, v := range key {
|
||
|
|
keys = append(keys, int(byte(v))+randCode1-randCode2)
|
||
|
|
}
|
||
|
|
|
||
|
|
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 < 0 {
|
||
|
|
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, progress func(float64)) error {
|
||
|
|
fpsrc, err := os.Open(src)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer fpsrc.Close()
|
||
|
|
|
||
|
|
stat, err := fpsrc.Stat()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
fpdst, err := os.Create(dst)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer fpdst.Close()
|
||
|
|
|
||
|
|
var sum int64
|
||
|
|
buf := make([]byte, 1024*1024)
|
||
|
|
for {
|
||
|
|
n, readErr := fpsrc.Read(buf)
|
||
|
|
if n > 0 {
|
||
|
|
sum += int64(n)
|
||
|
|
data := VicqueEncodeV1(buf[:n], pwd)
|
||
|
|
if _, err := fpdst.Write(data); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
reportProgress(progress, sum, stat.Size())
|
||
|
|
}
|
||
|
|
if readErr != nil {
|
||
|
|
if readErr == io.EOF {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
return readErr
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func VicqueDecodeV1File(src, dst, pwd string, progress func(float64)) error {
|
||
|
|
fpsrc, err := os.Open(src)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer fpsrc.Close()
|
||
|
|
|
||
|
|
stat, err := fpsrc.Stat()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
fpdst, err := os.Create(dst)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer fpdst.Close()
|
||
|
|
|
||
|
|
var sum int64
|
||
|
|
buf := make([]byte, 1024*1024+2)
|
||
|
|
for {
|
||
|
|
n, readErr := fpsrc.Read(buf)
|
||
|
|
if n > 0 {
|
||
|
|
sum += int64(n)
|
||
|
|
data := VicqueDecodeV1(buf[:n], pwd)
|
||
|
|
if _, err := fpdst.Write(data); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
reportProgress(progress, sum, stat.Size())
|
||
|
|
}
|
||
|
|
if readErr != nil {
|
||
|
|
if readErr == io.EOF {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
return readErr
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func reportProgress(progress func(float64), current, total int64) {
|
||
|
|
if progress == nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if total <= 0 {
|
||
|
|
progress(100)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
progress(float64(current) / float64(total) * 100)
|
||
|
|
}
|