0
|
1 /*
|
|
2 crypto.go : crypto-program.
|
|
3 Version : 0.0
|
3
|
4 Last Change: 2018-10-11 木 13:54:56.
|
0
|
5
|
|
6 install to: rsearcher_root/
|
|
7 server_root/
|
|
8 */
|
|
9 package main
|
|
10
|
|
11 import (
|
3
|
12 "crypto/aes"
|
|
13 "crypto/cipher"
|
|
14 "crypto/rand"
|
0
|
15 "crypto/sha256"
|
3
|
16 "encoding/csv"
|
|
17 "encoding/hex"
|
0
|
18 "fmt"
|
|
19 "flag"
|
3
|
20 "io"
|
|
21 "io/ioutil"
|
|
22 "log"
|
0
|
23 "os"
|
|
24 )
|
|
25
|
|
26 func main() {
|
3
|
27 salt := flag.String( "s", "dummysalt", "salt." )
|
|
28
|
0
|
29 enca := flag.String( "a", "", "encrypt plaintext." )
|
|
30 encb := flag.String( "b", "", "encrypt csv-file." )
|
|
31 coll := flag.String( "c", "", "collate user/password." )
|
|
32
|
|
33 decr := flag.String( "d", "", "deecrypt hhs." )
|
|
34 encr := flag.String( "e", "", "encrypt hhs." )
|
3
|
35 ghhs := flag.String( "f", "", "get hhs info." )
|
0
|
36
|
|
37 flag.Parse()
|
|
38
|
|
39 if *enca != "" {
|
|
40 buf := *salt + enc_sha256( *enca ) + *salt
|
|
41 fmt.Println( enc_sha256( buf ) )
|
|
42 os.Exit( 0 ) // done.
|
|
43 }
|
|
44
|
|
45 if *encb != "" {
|
3
|
46 f, err := os.Open( *encb ); if err != nil {
|
|
47 log.Fatal( err )
|
|
48 }
|
|
49 defer f.Close()
|
|
50
|
|
51 r := csv.NewReader( f )
|
|
52 for {
|
|
53 record, err := r.Read()
|
|
54 if err == io.EOF {
|
|
55 break
|
|
56 }
|
|
57 if err != nil {
|
|
58 log.Fatal( err )
|
|
59 }
|
|
60 buf := *salt + enc_sha256( record[ 1 ] ) + *salt
|
|
61 fmt.Println( record[ 0 ], enc_sha256( buf ) )
|
|
62 }
|
|
63 os.Exit( 0 ) // done.
|
|
64 }
|
|
65
|
|
66 if *coll != "" {
|
|
67 f, err := os.Open( *coll ); if err != nil {
|
|
68 log.Fatal( err )
|
|
69 }
|
|
70 defer f.Close()
|
|
71
|
|
72 if flag.NArg() != 2 {
|
|
73 fmt.Fprintf( os.Stderr, "bad argument\n" )
|
|
74 os.Exit( 1 )
|
|
75 }
|
|
76 user := flag.Arg( 0 )
|
|
77 pw := flag.Arg( 1 )
|
|
78
|
|
79 r := csv.NewReader( f )
|
|
80 r.Comma = ' '
|
0
|
81 for {
|
|
82 record, err := r.Read()
|
|
83 if err == io.EOF {
|
|
84 break
|
|
85 }
|
|
86 if err != nil {
|
|
87 log.Fatal( err )
|
|
88 }
|
3
|
89
|
|
90 if record[ 0 ] == user {
|
|
91 buf := *salt + enc_sha256( pw ) + *salt
|
|
92 if record[ 1 ] == enc_sha256( buf ) {
|
|
93 fmt.Println( "valid" )
|
|
94 os.Exit( 39 )
|
|
95 }
|
|
96 }
|
0
|
97 }
|
3
|
98 os.Exit( 0 ) // done.
|
0
|
99 }
|
|
100
|
3
|
101 key, _ := hex.DecodeString( "f368616e676520746869732070617373" ) // len = 32
|
|
102
|
0
|
103 if *decr != "" {
|
3
|
104 f, err := os.Open( *decr ); if err != nil {
|
|
105 log.Fatal( err )
|
|
106 }
|
|
107 defer f.Close()
|
|
108
|
|
109 ciphertext, err := ioutil.ReadAll( f )
|
|
110 if err != nil {
|
|
111 log.Fatal( err )
|
|
112 }
|
|
113
|
|
114 block, err := aes.NewCipher( key )
|
|
115 if err != nil {
|
|
116 panic( err )
|
|
117 }
|
|
118
|
|
119 iv := ciphertext[ :aes.BlockSize ]
|
|
120 plaintext := make( []byte, len( ciphertext ) - aes.BlockSize )
|
|
121 stream := cipher.NewCTR( block, iv )
|
|
122 stream.XORKeyStream( plaintext, ciphertext[ aes.BlockSize: ] )
|
|
123
|
|
124 fmt.Printf( "%s", plaintext )
|
|
125 os.Exit( 0 )
|
0
|
126 }
|
|
127
|
3
|
128
|
0
|
129 if *encr != "" {
|
3
|
130 f, err := os.Open( *encr ); if err != nil {
|
|
131 log.Fatal( err )
|
|
132 }
|
|
133 defer f.Close()
|
|
134
|
|
135 plaintext, err := ioutil.ReadAll( f )
|
|
136 if err != nil {
|
|
137 log.Fatal( err )
|
|
138 }
|
|
139
|
|
140 block, err := aes.NewCipher( key )
|
|
141 if err != nil {
|
|
142 panic( err )
|
|
143 }
|
|
144
|
|
145 // IV は公開してもいいので先頭につけておく
|
|
146 ciphertext := make( []byte, aes.BlockSize + len( plaintext ) )
|
|
147 iv := ciphertext[ :aes.BlockSize ]
|
|
148 if _, err := io.ReadFull( rand.Reader, iv ); err != nil {
|
|
149 panic( err )
|
|
150 }
|
|
151
|
|
152 stream := cipher.NewCTR( block, iv )
|
|
153 stream.XORKeyStream( ciphertext[ aes.BlockSize: ], plaintext )
|
|
154
|
|
155 fmt.Printf( "%x", ciphertext )
|
|
156 os.Exit( 0 )
|
0
|
157 }
|
|
158
|
3
|
159 if *ghhs != "" {
|
0
|
160 }
|
|
161
|
|
162 fmt.Fprintf( os.Stderr, "bad argument\n" )
|
|
163 os.Exit( 1 )
|
|
164 }
|
|
165
|
|
166 func enc_sha256( text string ) string {
|
|
167 h := sha256.New()
|
|
168 h.Write( []byte( text ) )
|
|
169 return fmt.Sprintf( "%x", h.Sum( nil ) )
|
|
170 }
|
|
171
|