Dernière activité 6 months ago

go prog which implements a rolling XOR

scusi a révisé ce gist 6 months ago. Aller à la révision

Aucun changement

Florian Walther a révisé ce gist 8 years ago. Aller à la révision

Aucun changement

Florian Walther a révisé ce gist 8 years ago. Aller à la révision

1 file changed, 53 insertions

xor.go(fichier créé)

@@ -0,0 +1,53 @@
1 + package main
2 +
3 + import (
4 + "container/ring"
5 + "flag"
6 + "io/ioutil"
7 + "log"
8 + )
9 +
10 + var keyFile string
11 + var keyString string
12 + var inFile string
13 + var outFile string
14 + var keyData []byte
15 + var err error
16 +
17 + func init() {
18 + flag.StringVar(&keyFile, "k", "key", "key file to use")
19 + flag.StringVar(&keyString, "s", "", "key to use, as string")
20 + flag.StringVar(&inFile, "f", "file", "file encrypt/decrypt")
21 + flag.StringVar(&outFile, "o", "out", "output file")
22 + }
23 +
24 + func check(err error) {
25 + if err != nil {
26 + log.Fatal(err)
27 + }
28 + }
29 +
30 + func main() {
31 + flag.Parse()
32 + if keyString == "" {
33 + // load key file
34 + keyData, err = ioutil.ReadFile(keyFile)
35 + check(err)
36 + } else {
37 + keyData = []byte(keyString)
38 + }
39 + // setup ring buffer with key data
40 + r := ring.New(len(keyData))
41 + for i := 0; i < r.Len(); i++ {
42 + r.Value = keyData[i]
43 + r = r.Next()
44 + }
45 + // load encrypted data from file
46 + data, err := ioutil.ReadFile(inFile)
47 + check(err)
48 + for i := 0; i < len(data); i++ { // foreach byte of data
49 + data[i] = r.Value.(byte) ^ data[i] // xor data byte with current ring element
50 + r = r.Next() // move ring forward
51 + }
52 + ioutil.WriteFile(outFile, data, 0700)
53 + }
Plus récent Plus ancien