Skip to content

Instantly share code, notes, and snippets.

@jnovikov
Last active May 5, 2019 09:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jnovikov/e3b2d7d0322cca8ca899e82f1be40d7a to your computer and use it in GitHub Desktop.
Save jnovikov/e3b2d7d0322cca8ca899e82f1be40d7a to your computer and use it in GitHub Desktop.
Xor Reader/Writer example
package main
import (
"fmt"
"io"
"os"
)
type XorWriter struct {
w io.Writer
key []byte
}
func (xw *XorWriter) Write(p []byte) (int, error) {
pXored := make([]byte, len(p), len(p))
for k, v := range p {
pXored[k] = v ^ xw.key[k%len(xw.key)]
}
return xw.w.Write(pXored)
}
type XorReader struct {
r io.Reader
key []byte
}
func (xr *XorReader) Read(p []byte) (int, error) {
n, err := xr.r.Read(p)
for i := 0; i < n; i++ {
p[i] = p[i] ^ xr.key[i % len(xr.key)]
}
return n, err
}
func main() {
//xr := XorReader{os.Stdin, 42}
//out := make([]byte, 100)
//xr.Read(out)
//fmt.Print(string(out))
f, _ := os.Create("test.txt")
defer f.Close()
text := []byte("Hello world")
xw := XorWriter{f, []byte{42, 41, 40}}
xw.Write(text)
f1, _ := os.Open("test.txt")
xr := XorReader{f1, []byte{42, 41, 40}}
out := make([]byte, 100)
xr.Read(out)
fmt.Println(string(out))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment