comparison go/crypto.go @ 5:e3b10fb860b3

release v1.0.
author pyon@macmini
date Mon, 22 Oct 2018 22:17:02 +0900
parents db4813125eb8
children f5ffc34f045a
comparison
equal deleted inserted replaced
4:06342fc544e4 5:e3b10fb860b3
1 /* 1 /*
2 crypto.go : crypto-program. 2 crypto.go : crypto-program.
3 Version : 0.0 3 Version : 0.0
4 Last Change: 2018-10-11 木 13:54:56. 4 Last Change: 2018-10-19 金 15:58:10.
5 5
6 install to: rsearcher_root/ 6 install to: rsearcher_root/
7 server_root/ 7 server_root/
8 */ 8 */
9 package main 9 package main
21 "io/ioutil" 21 "io/ioutil"
22 "log" 22 "log"
23 "os" 23 "os"
24 ) 24 )
25 25
26 var version string
27
28 func init() {
29 version = "1.0"
30 }
31
26 func main() { 32 func main() {
27 salt := flag.String( "s", "dummysalt", "salt." ) 33 salt := flag.String( "s", "dummysalt", "salt." )
28
29 enca := flag.String( "a", "", "encrypt plaintext." ) 34 enca := flag.String( "a", "", "encrypt plaintext." )
30 encb := flag.String( "b", "", "encrypt csv-file." ) 35 encb := flag.String( "b", "", "encrypt csv-file." )
31 coll := flag.String( "c", "", "collate user/password." ) 36 coll := flag.String( "c", "", "collate user/password." )
32 37
33 decr := flag.String( "d", "", "deecrypt hhs." ) 38 key := flag.String( "k", "1234567890abcdef1234567890abcdef", "key" ) // len = 32
34 encr := flag.String( "e", "", "encrypt hhs." ) 39 encr := flag.String( "e", "", "encrypt hhs." )
40 decr := flag.String( "d", "", "decrypt hhs." )
35 ghhs := flag.String( "f", "", "get hhs info." ) 41 ghhs := flag.String( "f", "", "get hhs info." )
42
43 pver := flag.Bool( "v", false, "print version." )
36 44
37 flag.Parse() 45 flag.Parse()
38 46
47 if *pver {
48 fmt.Println( "crypto [", version, "]" )
49 os.Exit( 0 )
50 }
51
52 /* Hash ( 1 word ) */
39 if *enca != "" { 53 if *enca != "" {
40 buf := *salt + enc_sha256( *enca ) + *salt 54 buf := *salt + enc_sha256( *enca ) + *salt
41 fmt.Println( enc_sha256( buf ) ) 55 fmt.Println( enc_sha256( buf ) )
42 os.Exit( 0 ) // done. 56 os.Exit( 0 ) // done.
43 } 57 }
44 58
59 /* Hash ( csv ) */
45 if *encb != "" { 60 if *encb != "" {
46 f, err := os.Open( *encb ); if err != nil { 61 f, err := os.Open( *encb ); if err != nil {
47 log.Fatal( err ) 62 log.Fatal( err )
48 } 63 }
49 defer f.Close() 64 defer f.Close()
61 fmt.Println( record[ 0 ], enc_sha256( buf ) ) 76 fmt.Println( record[ 0 ], enc_sha256( buf ) )
62 } 77 }
63 os.Exit( 0 ) // done. 78 os.Exit( 0 ) // done.
64 } 79 }
65 80
81 /* Password Check */
66 if *coll != "" { 82 if *coll != "" {
67 f, err := os.Open( *coll ); if err != nil { 83 f, err := os.Open( *coll ); if err != nil {
68 log.Fatal( err ) 84 log.Fatal( err )
69 } 85 }
70 defer f.Close() 86 defer f.Close()
96 } 112 }
97 } 113 }
98 os.Exit( 0 ) // done. 114 os.Exit( 0 ) // done.
99 } 115 }
100 116
101 key, _ := hex.DecodeString( "f368616e676520746869732070617373" ) // len = 32 117 /* Encrypto & Decrypto */
118 k, _ := hex.DecodeString( *key ) // len = 32
119 block, err := aes.NewCipher( k )
120 if err != nil {
121 panic( err )
122 }
102 123
103 if *decr != "" { 124 // encrypto file
104 f, err := os.Open( *decr ); if err != nil { 125 if *encr != "" {
105 log.Fatal( err ) 126 plaintext, err := ioutil.ReadFile( *encr ) // 入力CSVは S-JIS
106 }
107 defer f.Close()
108
109 ciphertext, err := ioutil.ReadAll( f )
110 if err != nil { 127 if err != nil {
111 log.Fatal( err ) 128 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 )
126 }
127
128
129 if *encr != "" {
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 } 129 }
144 130
145 // IV は公開してもいいので先頭につけておく 131 // IV は公開してもいいので先頭につけておく
146 ciphertext := make( []byte, aes.BlockSize + len( plaintext ) ) 132 ciphertext := make( []byte, aes.BlockSize + len( plaintext ) )
147 iv := ciphertext[ :aes.BlockSize ] 133 iv := ciphertext[ :aes.BlockSize ]
150 } 136 }
151 137
152 stream := cipher.NewCTR( block, iv ) 138 stream := cipher.NewCTR( block, iv )
153 stream.XORKeyStream( ciphertext[ aes.BlockSize: ], plaintext ) 139 stream.XORKeyStream( ciphertext[ aes.BlockSize: ], plaintext )
154 140
155 fmt.Printf( "%x", ciphertext ) 141 fmt.Printf( "%s", ciphertext )
156 os.Exit( 0 ) 142 os.Exit( 0 )
157 } 143 }
158 144
159 if *ghhs != "" { 145 // decrypt file
146 if *decr != "" {
147 ciphertext, err := ioutil.ReadFile( *decr )
148 if err != nil {
149 log.Fatal( err )
150 }
151
152 iv := ciphertext[ :aes.BlockSize ]
153 plaintext := make( []byte, len( ciphertext[ aes.BlockSize: ] ) )
154 stream := cipher.NewCTR( block, iv )
155 stream.XORKeyStream( plaintext, ciphertext[ aes.BlockSize: ] )
156
157 fmt.Printf( "%s", plaintext )
158 os.Exit( 0 )
160 } 159 }
161 160
161 /* Etc */
162 if *ghhs != "" {
163 os.Exit( 0 )
164 }
165
166 /* Error */
162 fmt.Fprintf( os.Stderr, "bad argument\n" ) 167 fmt.Fprintf( os.Stderr, "bad argument\n" )
163 os.Exit( 1 ) 168 os.Exit( 1 )
164 } 169 }
165 170
171 /* Hash Function */
166 func enc_sha256( text string ) string { 172 func enc_sha256( text string ) string {
167 h := sha256.New() 173 h := sha256.New()
168 h.Write( []byte( text ) ) 174 h.Write( []byte( text ) )
169 return fmt.Sprintf( "%x", h.Sum( nil ) ) 175 return fmt.Sprintf( "%x", h.Sum( nil ) )
170 } 176 }