Mercurial > mercurial > hgweb_rsearcher.cgi
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 ) ) }