-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdh-server.go
74 lines (70 loc) · 2.09 KB
/
dh-server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"io"
"log"
"fmt"
"net/http"
"encoding/json"
"github.com/garyburd/redigo/redis"
"Dh"
)
type DHInitStruct struct {
P string `json:"p"`
G string `json:"g"`
ProcessedServerNumber string `json:"processedServerNumber"`
}
func main() {
http.HandleFunc( "/init", Init )
http.HandleFunc( "/compute", Compute )
err := http.ListenAndServe( ":6666", nil )
if err != nil {
log.Fatal( "Listen&Serve : ", err )
}
}
func Init( w http.ResponseWriter, r *http.Request ) {
p, g, serverNumber, processedServerNumber := Dh.Init()
// 写入redis数据
redisConn, redisErr := redis.Dial( "tcp", "127.0.0.1:6379" )
if redisErr != nil {
fmt.Println( "Connect to redis error", redisErr )
return
}
defer redisConn.Close()
_, DoErr := redisConn.Do( "SET", "p", p )
if DoErr != nil {
fmt.Println( "redis set failed:", DoErr )
}
_, DoErr = redisConn.Do( "SET", "serverNumber", serverNumber )
if DoErr != nil {
fmt.Println( "redis set failed:", DoErr )
}
// 将数据marshal成json字符串吐给客户端.
dhInitRawData := DHInitStruct{ p, g, processedServerNumber }
dhInitData, _ := json.Marshal( dhInitRawData )
// 返回给客户端数据
io.WriteString( w, string( dhInitData ) )
}
func Compute( w http.ResponseWriter, r *http.Request ) {
// 从post中获取client_number
sClientNumber := r.PostFormValue("clientNumber")
// 从redis中获取 serverNumber 和 p
redisConn, redisErr := redis.Dial( "tcp", "127.0.0.1:6379" )
if redisErr != nil {
fmt.Println( "Connect to redis error", redisErr )
return
}
defer redisConn.Close()
sP, doErr := redis.String( redisConn.Do( "GET", "p" ) )
if doErr != nil {
fmt.Println( "redis get failed:", doErr )
}
sServerNumber, doErr := redis.String( redisConn.Do( "GET", "serverNumber" ) )
if doErr != nil {
fmt.Println( "redis get failed:", doErr )
}
// 调用Dh包中的方法
iKey := Dh.ComputeShareKey( sP, sServerNumber, sClientNumber )
fmt.Println( "key:", iKey )
// 这个key便是计算出出来的用于对称加解密的公钥
io.WriteString( w, "compute\n" )
}