view 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 source

/*
 crypto.go  : crypto-program.
 Version    : 0.0
 Last Change: 2018-10-11 木 13:54:56.

 install to: rsearcher_root/
             server_root/
*/
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", "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." )
	ghhs := flag.String( "f", "", "get hhs info." )

	flag.Parse()

	if *enca != "" {
		buf := *salt + enc_sha256( *enca ) + *salt
		fmt.Println( enc_sha256( buf ) )
		os.Exit( 0 )	// done.
	}

	if *encb != "" {
		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 {
				break
			}
			if err != nil {
				log.Fatal( err )
			}

			if record[ 0 ] == user {
				buf := *salt + enc_sha256( pw ) + *salt
				if record[ 1 ] == enc_sha256( buf ) {
					fmt.Println( "valid" )
					os.Exit( 39 )
				}
			}
		}
		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 *ghhs != "" {
	}

	fmt.Fprintf( os.Stderr, "bad argument\n" )
	os.Exit( 1 )
}

func enc_sha256( text string ) string {
	h := sha256.New()
	h.Write( []byte( text ) )
	return fmt.Sprintf( "%x", h.Sum( nil ) )
}