annotate go/crypto.go @ 15:c262e17de9b1

db download skip-mode.
author pyon@macmini
date Sat, 08 Jun 2019 15:50:59 +0900
parents f5ffc34f045a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
1 /*
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
2 crypto.go : crypto-program.
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
3 Version : 1.1
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
4 Last Change: 2018-11-14 水 13:27:48.
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
5
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
6 install to: rsearcher_root/
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
7 server_root/
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
8 */
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
9 package main
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
10
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
11 import (
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
12 "crypto/aes"
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
13 "crypto/cipher"
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
14 "crypto/rand"
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
15 "crypto/sha256"
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
16 "encoding/csv"
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
17 "encoding/hex"
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
18 "fmt"
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
19 "flag"
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
20 "io"
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
21 "io/ioutil"
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
22 "log"
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
23 "os"
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
24 )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
25
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
26 var version string
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
27
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
28 func init() {
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
29 version = "1.1" // output file version
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
30 }
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
31
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
32 func main() {
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
33 salt := flag.String( "s", "dummysalt", "salt." )
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
34 enca := flag.String( "a", "", "encrypt plaintext." )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
35 encb := flag.String( "b", "", "encrypt csv-file." )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
36 coll := flag.String( "c", "", "collate user/password." )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
37
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
38 key := flag.String( "k", "1234567890abcdef1234567890abcdef", "key" ) // len = 32
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
39 encr := flag.String( "e", "", "encrypt hhs." )
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
40 decr := flag.String( "d", "", "decrypt hhs." )
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
41 ghhs := flag.String( "f", "", "get hhs info." )
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
42
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
43 opf := flag.String( "o", "", "output file." )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
44
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
45 pver := flag.Bool( "v", false, "print version." )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
46
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
47 flag.Parse()
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
48
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
49 if *pver {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
50 fmt.Println( "crypto [", version, "]" )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
51 os.Exit( 0 )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
52 }
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
53
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
54 /* Hash ( 1 word ) */
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
55 if *enca != "" {
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
56 buf := *salt + enc_sha256( *enca ) + *salt
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
57 fmt.Println( enc_sha256( buf ) )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
58 os.Exit( 0 ) // done.
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
59 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
60
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
61 /* Hash ( csv ) */
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
62 if *encb != "" {
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
63 f, err := os.Open( *encb ); if err != nil {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
64 log.Fatal( err )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
65 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
66 defer f.Close()
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
67
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
68 r := csv.NewReader( f )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
69 for {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
70 record, err := r.Read()
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
71 if err == io.EOF {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
72 break
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
73 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
74 if err != nil {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
75 log.Fatal( err )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
76 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
77 buf := *salt + enc_sha256( record[ 1 ] ) + *salt
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
78 fmt.Println( record[ 0 ], enc_sha256( buf ) )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
79 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
80 os.Exit( 0 ) // done.
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
81 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
82
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
83 /* Password Check */
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
84 if *coll != "" {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
85 f, err := os.Open( *coll ); if err != nil {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
86 log.Fatal( err )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
87 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
88 defer f.Close()
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
89
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
90 if flag.NArg() != 2 {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
91 fmt.Fprintf( os.Stderr, "bad argument\n" )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
92 os.Exit( 1 )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
93 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
94 user := flag.Arg( 0 )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
95 pw := flag.Arg( 1 )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
96
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
97 r := csv.NewReader( f )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
98 r.Comma = ' '
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
99 for {
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
100 record, err := r.Read()
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
101 if err == io.EOF {
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
102 break
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
103 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
104 if err != nil {
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
105 log.Fatal( err )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
106 }
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
107
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
108 if record[ 0 ] == user {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
109 buf := *salt + enc_sha256( pw ) + *salt
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
110 if record[ 1 ] == enc_sha256( buf ) {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
111 fmt.Println( "valid" )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
112 os.Exit( 39 )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
113 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
114 }
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
115 }
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
116 os.Exit( 0 ) // done.
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
117 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
118
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
119 /* Encrypto & Decrypto */
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
120 k, _ := hex.DecodeString( *key ) // len = 32
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
121 block, err := aes.NewCipher( k )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
122 if err != nil {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
123 panic( err )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
124 }
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
125
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
126 // encrypto file
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
127 if *encr != "" {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
128 plaintext, err := ioutil.ReadFile( *encr ) // 入力CSVは S-JIS
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
129 if err != nil {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
130 log.Fatal( err )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
131 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
132
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
133 // IV は公開してもいいので先頭につけておく
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
134 ciphertext := make( []byte, aes.BlockSize + len( plaintext ) )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
135 iv := ciphertext[ :aes.BlockSize ]
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
136 if _, err := io.ReadFull( rand.Reader, iv ); err != nil {
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
137 panic( err )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
138 }
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
139
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
140 stream := cipher.NewCTR( block, iv )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
141 stream.XORKeyStream( ciphertext[ aes.BlockSize: ], plaintext )
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
142
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
143 //fmt.Printf( "%s", ciphertext )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
144 output( *opf, string( ciphertext ) )
3
db4813125eb8 many changes.
pyon@macmini
parents: 0
diff changeset
145 os.Exit( 0 )
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
146 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
147
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
148 // decrypt file
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
149 if *decr != "" {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
150 ciphertext, err := ioutil.ReadFile( *decr )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
151 if err != nil {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
152 log.Fatal( err )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
153 }
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
154
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
155 iv := ciphertext[ :aes.BlockSize ]
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
156 plaintext := make( []byte, len( ciphertext[ aes.BlockSize: ] ) )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
157 stream := cipher.NewCTR( block, iv )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
158 stream.XORKeyStream( plaintext, ciphertext[ aes.BlockSize: ] )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
159
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
160 //fmt.Printf( "%s", plaintext )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
161 output( *opf, string( plaintext ) )
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
162 os.Exit( 0 )
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
163 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
164
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
165 /* Etc */
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
166 if *ghhs != "" {
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
167 os.Exit( 0 )
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
168 }
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
169
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
170 /* Error */
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
171 fmt.Fprintf( os.Stderr, "bad argument\n" )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
172 os.Exit( 1 )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
173 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
174
5
e3b10fb860b3 release v1.0.
pyon@macmini
parents: 3
diff changeset
175 /* Hash Function */
0
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
176 func enc_sha256( text string ) string {
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
177 h := sha256.New()
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
178 h.Write( []byte( text ) )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
179 return fmt.Sprintf( "%x", h.Sum( nil ) )
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
180 }
d3b8cd5aeb70 make repo.
pyon@macmini
parents:
diff changeset
181
13
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
182 /* Output Function */
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
183 func output( file, str string ) {
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
184 if file == "" {
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
185 fmt.Fprint( os.Stdout, str )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
186 } else {
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
187 os.Remove( file )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
188 f, err := os.OpenFile( file, os.O_RDWR|os.O_CREATE, 0644 )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
189 if err != nil {
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
190 log.Fatal( err )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
191 }
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
192 defer f.Close()
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
193 fmt.Fprint( f, str )
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
194 }
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
195 }
f5ffc34f045a manage DB.
pyon@macmini
parents: 5
diff changeset
196