-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstringEncoder.go
More file actions
118 lines (112 loc) · 3.37 KB
/
Copy pathstringEncoder.go
File metadata and controls
118 lines (112 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main
import (
"encoding/base64"
"fmt"
"math/big"
)
var KEY = new(big.Int).SetBytes([]byte("*SomeSuperLingComplexString"))
func main() {
Somestring := "poop"
fmt.Println("Origional: " + Somestring)
encoded := customEncode(Somestring)
fmt.Println("Encoded String: " + encoded)
decoded := customDecode(encoded)
fmt.Println("Decoded String: " + decoded)
}
/**
Base 64 encode a message to be sent to the server
*/
func b64_encode(text string) string {
encoded := base64.StdEncoding.EncodeToString([]byte(text))
return encoded
}
/**
base 64 decode a message from the server
*/
func b64_decode(text string) string {
decoded, err := base64.StdEncoding.DecodeString(text)
if err != nil {
fmt.Println(err)
}
return string(decoded)
}
/**
OPERATIONS:
KEY EXPANSION
XOR STRING
BASE64
*/
func customEncode(text string) string {
bytetext := []byte(text)
bigint := new(big.Int).SetBytes(bytetext)
keyByteArr := KEY.Bytes()
// If we need to shorten the Key
if len(KEY.Bytes()) > len(bigint.Bytes()) {
// Creates a new key of the first few bits of the key
NewKey := new(big.Int).SetBytes(keyByteArr[:len(bytetext)])
return b64_encode(string(new(big.Int).Xor(bigint, NewKey).Bytes()))
} else {
// If we need to lengthen the key
howMuchBigger := len(bytetext) / len(keyByteArr)
missingbytes := 0
var bytesToAppend []byte
if howMuchBigger < 2 {
// If we only need to lengthen it a little bit
missingbytes = len(bytetext) - len(keyByteArr)
bytesToAppend = keyByteArr
} else {
// Extends the key by a factor greater then 2
extendedkey := new(big.Int)
newKeyArray := keyByteArr
// Extends key
for i := 1; i < howMuchBigger; i++ {
newKeyArray = append(newKeyArray, keyByteArr...)
if i == howMuchBigger-1 {
extendedkey.SetBytes(newKeyArray)
}
}
// Calculates remaining difference
missingbytes = len(bytetext) - len(extendedkey.Bytes())
bytesToAppend = extendedkey.Bytes()
}
NewKey := new(big.Int).SetBytes(keyByteArr[:missingbytes])
// Xor encodes
finalKey := new(big.Int).SetBytes(append(bytesToAppend, NewKey.Bytes()...))
return b64_encode(string(new(big.Int).Xor(bigint, finalKey).Bytes()))
}
return "hello"
}
func customDecode(text string) string {
//Reverses order of b64 encode from Custom Encode function
decodedStr := []byte(b64_decode(text))
decodeBigInt := new(big.Int).SetBytes(decodedStr)
keyByteArr := KEY.Bytes()
if len(KEY.Bytes()) > len(decodeBigInt.Bytes()) {
// Creates a new key of the first few bits of the key
NewKey := new(big.Int).SetBytes(keyByteArr[:len(decodedStr)])
return string(new(big.Int).Xor(decodeBigInt, NewKey).Bytes())
} else {
howMuchBigger := len(decodedStr) / len(keyByteArr)
missingbytes := 0
var bytesToAppend []byte
if howMuchBigger < 2 {
missingbytes = len(decodedStr) - len(keyByteArr)
bytesToAppend = keyByteArr
} else {
extendedkey := new(big.Int)
newKeyArray := keyByteArr
for i := 1; i <= howMuchBigger; i++ {
newKeyArray = append(newKeyArray, keyByteArr...)
if i == howMuchBigger-1 {
extendedkey.SetBytes(newKeyArray)
}
}
missingbytes = len(decodedStr) - len(extendedkey.Bytes())
bytesToAppend = extendedkey.Bytes()
}
NewKey := new(big.Int).SetBytes(keyByteArr[:missingbytes])
finalKey := new(big.Int).SetBytes(append(bytesToAppend, NewKey.Bytes()...))
return string(new(big.Int).Xor(decodeBigInt, finalKey).Bytes())
}
return "hello"
}