From 63f4d82470428fd468cfc4daf2439818245d888a Mon Sep 17 00:00:00 2001 From: moshix Date: Sat, 14 Nov 2020 08:01:30 -0600 Subject: [PATCH] Create random.go --- random.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 random.go diff --git a/random.go b/random.go new file mode 100644 index 0000000..5429e8b --- /dev/null +++ b/random.go @@ -0,0 +1,83 @@ +package main +/* copyright 2020 by moshix + crypto/rand number generator using /dev/random (depends on reliability of this Linux mechanism... + or connect to Java library for atmospheric noise random number generator as in second example +*/ + +import ( + crand "crypto/rand" + rand "math/rand" + + "encoding/binary" + "fmt" + "log" + "os" + "strconv" +) +// check the numbers.log file with dieharder entropy checker with +// dieharder -a -c ' ' -f numbers.log where -c ' ' is the seperator between numbers +func main() { + // check if numbers.log file is > 1MB delete it + var numsize int64 + fileStat, err := os.Stat("numbers.log") + if err != nil { + log.Fatal(err) + } + numsize = fileStat.Size() + if numsize > 1000000 { + e := os.Remove("numbers.log") + if e != nil { + log.Fatal(e) + } + } + + f, err := os.OpenFile("numbers.log", + os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) + if err != nil { + log.Println(err) + } + defer f.Close() + var number int + for i := 1; i < 14; i++ { + var src cryptoSource + rnd := rand.New(src) + number = rnd.Intn(899) + 100 + s := strconv.Itoa(number) + fmt.Print(number) + fmt.Print(" ") + if _, err := f.WriteString(s + " "); err != nil { + log.Println(err) + } + } + + fmt.Print(" ..... ") // seperator for block on web page + + for i := 1; i < 14; i++ { + var src cryptoSource + rnd := rand.New(src) + number = rnd.Intn(899) + 100 + s := strconv.Itoa(number) + fmt.Print(number) + fmt.Print(" ") + if _, err := f.WriteString(s + " "); err != nil { + log.Println(err) + } + } + +} + +type cryptoSource struct{} + +func (s cryptoSource) Seed(seed int64) {} + +func (s cryptoSource) Int63() int64 { + return int64(s.Uint64() & ^uint64(1<<63)) +} + +func (s cryptoSource) Uint64() (v uint64) { + err := binary.Read(crand.Reader, binary.BigEndian, &v) + if err != nil { + log.Fatal(err) + } + return v +}