diff go/crypto.go @ 3:db4813125eb8

many changes.
author pyon@macmini
date Thu, 11 Oct 2018 22:11:09 +0900
parents d3b8cd5aeb70
children e3b10fb860b3
line wrap: on
line diff
--- a/go/crypto.go	Tue Oct 02 21:20:05 2018 +0900
+++ b/go/crypto.go	Thu Oct 11 22:11:09 2018 +0900
@@ -1,7 +1,7 @@
 /*
  crypto.go  : crypto-program.
  Version    : 0.0
- Last Change: 2018-09-30 Sun 16:47:45.
+ Last Change: 2018-10-11 木 13:54:56.
 
  install to: rsearcher_root/
              server_root/
@@ -9,22 +9,30 @@
 package main
 
 import (
+	"crypto/aes"
+	"crypto/cipher"
+	"crypto/rand"
 	"crypto/sha256"
+	"encoding/csv"
+	"encoding/hex"
 	"fmt"
 	"flag"
+	"io"
+	"io/ioutil"
+	"log"
 	"os"
 )
 
 func main() {
-	salt := flag.String( "s", "#!@-", "salt." )
+	salt := flag.String( "s", "dummysalt", "salt." )
+
 	enca := flag.String( "a", "", "encrypt plaintext." )
 	encb := flag.String( "b", "", "encrypt csv-file." )
 	coll := flag.String( "c", "", "collate user/password." )
 
 	decr := flag.String( "d", "", "deecrypt hhs." )
 	encr := flag.String( "e", "", "encrypt hhs." )
-	chdb := flag.String( "f", "", "collate hhs." )
-	chhs := flag.String( "g", "", "collate hhs." )
+	ghhs := flag.String( "f", "", "get hhs info." )
 
 	flag.Parse()
 
@@ -35,7 +43,41 @@
 	}
 
 	if *encb != "" {
-		r := csv.NewReader(strings.NewReader(in))
+		f, err := os.Open( *encb ); if err != nil {
+			log.Fatal( err )
+		}
+		defer f.Close()
+
+		r := csv.NewReader( f )
+		for {
+			record, err := r.Read()
+			if err == io.EOF {
+				break
+			}
+			if err != nil {
+				log.Fatal( err )
+			}
+			buf := *salt + enc_sha256( record[ 1 ] ) + *salt
+			fmt.Println( record[ 0 ], enc_sha256( buf ) )
+		}
+		os.Exit( 0 )	// done.
+	}
+
+	if *coll != "" {
+		f, err := os.Open( *coll ); if err != nil {
+			log.Fatal( err )
+		}
+		defer f.Close()
+
+		if flag.NArg() != 2 {
+			fmt.Fprintf( os.Stderr, "bad argument\n" )
+			os.Exit( 1 )
+		}
+		user := flag.Arg( 0 )
+		pw   := flag.Arg( 1 )
+
+		r := csv.NewReader( f )
+		r.Comma = ' '
 		for {
 			record, err := r.Read()
 			if err == io.EOF {
@@ -44,21 +86,77 @@
 			if err != nil {
 				log.Fatal( err )
 			}
-			buf := *salt + enc_sha256( record[1] ) + *salt
-			fmt.Println( record[0], ",", enc_sha256( buf ) )
+
+			if record[ 0 ] == user {
+				buf := *salt + enc_sha256( pw ) + *salt
+				if record[ 1 ] == enc_sha256( buf ) {
+					fmt.Println( "valid" )
+					os.Exit( 39 )
+				}
+			}
 		}
-	}
-
-	if *coll != "" {
+		os.Exit( 0 )	// done.
 	}
 
+	key, _ := hex.DecodeString( "f368616e676520746869732070617373" )	// len = 32
+
 	if *decr != "" {
+		f, err := os.Open( *decr ); if err != nil {
+			log.Fatal( err )
+		}
+		defer f.Close()
+
+		ciphertext, err := ioutil.ReadAll( f )
+		if err != nil {
+			log.Fatal( err )
+		}
+
+		block, err := aes.NewCipher( key )
+		if err != nil {
+			panic( err )
+		}
+
+		iv := ciphertext[ :aes.BlockSize ]
+		plaintext := make( []byte, len( ciphertext ) - aes.BlockSize )
+		stream := cipher.NewCTR( block, iv )
+		stream.XORKeyStream( plaintext, ciphertext[ aes.BlockSize: ] )
+
+		fmt.Printf( "%s", plaintext )
+		os.Exit( 0 )
 	}
 
+
 	if *encr != "" {
+		f, err := os.Open( *encr ); if err != nil {
+			log.Fatal( err )
+		}
+		defer f.Close()
+
+		plaintext, err := ioutil.ReadAll( f )
+		if err != nil {
+			log.Fatal( err )
+		}
+
+		block, err := aes.NewCipher( key )
+		if err != nil {
+			panic( err )
+		}
+
+		// IV は公開してもいいので先頭につけておく
+		ciphertext := make( []byte, aes.BlockSize + len( plaintext ) )
+		iv := ciphertext[ :aes.BlockSize ]
+		if _, err := io.ReadFull( rand.Reader, iv ); err != nil {
+			panic( err )
+		}
+
+		stream := cipher.NewCTR( block, iv )
+		stream.XORKeyStream( ciphertext[ aes.BlockSize: ], plaintext )
+
+		fmt.Printf( "%x", ciphertext )
+		os.Exit( 0 )
 	}
 
-	if *chdb != "" && *chhs != "" {
+	if *ghhs != "" {
 	}
 
 	fmt.Fprintf( os.Stderr, "bad argument\n" )
@@ -71,7 +169,3 @@
 	return fmt.Sprintf( "%x", h.Sum( nil ) )
 }
 
-func encrypt( text string ) []byte {
-	return nil
-}
-