mirror of
				https://gogs.blitter.com/RLabs/cryptmt
				synced 2024-08-14 19:26:42 +00:00 
			
		
		
		
	Added io.Reader/Writers to satisfy io.Copy() interface
Added cmd/main for CLI usage Signed-off-by: Russ Magee <rmagee@gmail.com>
This commit is contained in:
		
							parent
							
								
									ce6570ddcc
								
							
						
					
					
						commit
						41d01db0ab
					
				
					 2 changed files with 55 additions and 4 deletions
				
			
		
							
								
								
									
										33
									
								
								cmd/main.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								cmd/main.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| // WANDERER - a crypto doodle that appears to give adequate | ||||
| // protection to data in a stream cipher context (?) | ||||
| // | ||||
| // Properties visualized using https://github.com/circulosmeos/circle | ||||
| // | ||||
| // test command-line 'main' program | ||||
| package main | ||||
| 
 | ||||
| // TODOs: | ||||
| // -use a crypto rand (eg mtwist64) instead of go pkg rand? | ||||
| // -define s-box rotation/shuffle schema | ||||
| // -devise p-box schema | ||||
| // ... | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 
 | ||||
| 	"blitter.com/go/cryptmt" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	k string | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.StringVar(&k, "k", "WARNING_DEFAULT_KEY", "Key (NOTE insecure specified on command line)") | ||||
| 	flag.Parse() | ||||
| 
 | ||||
| 	c := cryptmt.New(os.Stdin, os.Stdout, []byte(k)) | ||||
| 	_, _ = io.Copy(c, c) | ||||
| } | ||||
							
								
								
									
										26
									
								
								cryptmt.go
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								cryptmt.go
									
										
									
									
									
								
							|  | @ -1,6 +1,6 @@ | |||
| // Package CryptMT - implementation of cryptMTv1 stream cipher | ||||
| // (but with mtwist64 as base accum)  | ||||
| // https://eprint.iacr.org/2005/165.pdf  | ||||
| // (but with mtwist64 as base accum) | ||||
| // https://eprint.iacr.org/2005/165.pdf | ||||
| package cryptmt | ||||
| 
 | ||||
| // TODO rlm: according to go docs, stream ciphers do not implement the | ||||
|  | @ -11,11 +11,14 @@ package cryptmt | |||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 
 | ||||
| 	mtwist "blitter.com/go/mtwist" | ||||
| ) | ||||
| 
 | ||||
| type Cipher struct { | ||||
| 	r     io.Reader | ||||
| 	w     io.Writer | ||||
| 	accum uint64 | ||||
| 	m     *mtwist.MT19937_64 | ||||
| } | ||||
|  | @ -28,8 +31,8 @@ func (c *Cipher) yield() (r byte) { | |||
| 
 | ||||
| // New creates and returns a Cipher. The key argument should be the | ||||
| // CryptMT key, 64 bytes. | ||||
| func New(key []byte) (c *Cipher) { | ||||
| 	c = &Cipher{m: mtwist.New()} | ||||
| func New(r io.Reader, w io.Writer, key []byte) (c *Cipher) { | ||||
| 	c = &Cipher{m: mtwist.New(), r: r, w: w} | ||||
| 	c.m.SeedFullState(key) | ||||
| 	c.accum = 1 | ||||
| 	// from paper, discard first 64 bytes of output | ||||
|  | @ -39,6 +42,21 @@ func New(key []byte) (c *Cipher) { | |||
| 	return c | ||||
| } | ||||
| 
 | ||||
| func (c *Cipher) Read(p []byte) (n int, err error) { | ||||
| 	n, err = c.r.Read(p) | ||||
| 	if err == nil { | ||||
| 		for idx := 0; idx < n; idx++ { | ||||
| 			p[idx] = p[idx] ^ c.yield() | ||||
| 		} | ||||
| 	} | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func (c *Cipher) Write(p []byte) (n int, err error) { | ||||
| 	n, err = c.w.Write(p) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| // XORKeyStream XORs each byte in the given slice with a byte from the | ||||
| // cipher's key stream. Dst and src must overlap entirely or not at all. | ||||
| // | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue