0
点赞
收藏
分享

微信扫一扫

go解密测试


//加密过程-->  
//573232 & 255 = 48 //&运算 --->48
//573232 >> 8 = 2239 //>>8运算
//2239 & 255 = 191 //&运算 --->191
//2239 >> 8 = 8 //>>8运算
//8 & 255 = 8 //&运算 --->8
//8 >> 8 = 0 //>>8运算
//0 & 255 = 0 //&运算 --->0
//0 >> 0 = 0 //>>8运算
//最终得到的加密数据 [48,191,8,0]
//解密过程-->
//解密数据 x[48,191,8,0]
//数据长度 4 索引为 0,1,2,3
//从最后一位开始计算
//x[3] = 0 , x[2]=8 ,x[1]=191 , x[0] = 48
//y:=0
/for i:=索引-1;i>=0;i--{
// y=x[i]
// y<<8
// y=y+x[i-1]
//}
/y = y + x[索引] << 8 + x[索引-1]
// x[3]=0 << 8 = 0 + x[3-1](8) = 8 (1)
// 8 << 8 = 2048 + x[3-2](191) = 2239 (2)
// 2239 << 8 = 573184 + x[3-3](48) = 573232 (3)

解密 

//解密
func byteDencrypt(byteData []byte,len int) int32 {
//测试位 []byte{48,191,8,0}
//4-1-0 = 3 byteData[3] = 0
//4-1-1 = 2 byteData[2] = 8
//4-1-2 = 1 byteData[1] = 191
//4-1-3 = 0 byteData[0] = 48
//取最后一位
x := int32(byteData[len-1])
//len-1为第一个数没有进行位移,所以去掉循环
for i := 0; i < len-1; i++ {
index :=len-1-i //反向取数
x=x<<8+int32(byteData[index-1]) //保存上次计算结果
//fmt.Println(x,i,index)
}
fmt.Println(x)
return x
}

测试 

//{"length":15,"type":1100,"protocol":9,"uid":0,"data":[10,3,176,254,34]}
byteDencrypt([]byte{15,0},2) //15 & 255 =15 , 15 >> 8 = 0 [15,0]
byteDencrypt([]byte{76,4},2) //1100 & 255 = 76 , 76 >> 8 = 4 [76,4]
byteDencrypt([]byte{9,0},2) //9 & 255 = 9 , 9 >> 8 = 0 [9,0]
byteDencrypt([]byte{0,0,0,0},4) //0 & 255 = 0 , 0 >> 8 = 0 [0,0,0,0]
//byteDencrypt([]byte{10,3,176,254,34},5) //protobuf struct []btyes

//加密测试
fmt.Println(byteEncrypt(1100,2))
fmt.Println(byteEncrypt(573232,4))
//解密测试
byteDencrypt([]byte{76,4},2) //1100
byteDencrypt([]byte{48,191,8,0},4) //573232

[76 4]
[48 191 8 0]
1100
573232

go解密测试_二进制数

 

 

package main
import (
//"strings"
//"reflect"
"bytes"
"fmt"
"encoding/binary"
"net/http"
"github.com/gorilla/websocket"
"time"
"gowebsocket/impl"
"github.com/golang/protobuf/proto"
)
var(
upgrader = websocket.Upgrader{
// 允许跨域
CheckOrigin:func(r *http.Request) bool{
return true
},
}
)

func wsHandler(w http.ResponseWriter , r *http.Request){
var(
wsConn *websocket.Conn
err error
conn *impl.Connection
data []byte
)
// 完成ws协议的握手操作
// Upgrade:websocket
if wsConn , err = upgrader.Upgrade(w,r,nil); err != nil{
return
}

if conn , err = impl.InitConnection(wsConn); err != nil{
goto ERR
}

// 启动线程,不断发消息
go func(){
var (err error)
//构造二进制数据
loginResponse := &LoginResponse{
Result: 0,
UserId: 573232,
}
data,_ := proto.Marshal(loginResponse)
fmt.Println("proto结构二进制数据:",data)

//返回给客户端的数据:{"length":14,"type":1000,"protocol":2,"uid":48944,"data":[16,176,254,34]} //请求登陆成功
pkg:=pkgData(data,4) //测试包装数据 4->protobuf data struct len
fmt.Println("返回给客户端的二进制数据:",pkg)

for{
//发送二进制数据
if err = conn.WriteMessage(pkg);err != nil{
return
}
time.Sleep(3*time.Second)
}
}()

for {
data , err = conn.ReadMessage();
fmt.Println("数据包长度高位",data[0])
fmt.Println("数据包长度低位",data[1])
fmt.Println("主协议高位:",data[2])
fmt.Println("主协议低位",data[3])
fmt.Println("消息协议高位",data[4])
fmt.Println("消息协议低位",data[5])
fmt.Println("UID[0]",data[6])
fmt.Println("UID[1]",data[7])
fmt.Println("UID[2]",data[8])
fmt.Println("UID[3]",data[9])

if err != nil{
goto ERR
}
fmt.Println("客户端发来的二进制数据: ",data)
//分析进制数据并解码proto
//第1个两位:数据长度 第2个两位:网关类型 第3个两位:协议 第4个两位:uid 第9位开始为数据内容(proto.Marshal编码后的位集合)
err = conn.WriteMessage(data);
if err !=nil{
goto ERR
}
}

ERR:
conn.Close()

}

//打包给客户端的数据
func pkgData(protoData []byte,dataSize int64) []byte {
pkgsize := dataSize+10
datapkg := make([]byte,pkgsize)
//数据长度
pByteLength := byteEncrypt(pkgsize,2)
datapkg[0]=pByteLength[0]
datapkg[1]=pByteLength[1]
//网关类型
pGateType:=byteEncrypt(1000,2)
datapkg[2]=pGateType[0]
datapkg[3]=pGateType[1]
//消息协议
pProtoData:=byteEncrypt(2,2)
datapkg[4]=pProtoData[0]
datapkg[5]=pProtoData[1]
//UID
pUID:=byteEncrypt(573232,4)
datapkg[6]=pUID[0]
datapkg[7]=pUID[1]
datapkg[8]=pUID[2]
datapkg[9]=pUID[3]
//数据实体
for i,_ := range protoData{
datapkg[i+10]=protoData[i]
}
fmt.Println(fmt.Sprintf("进行包装后的包头数据: [%v %v %v %v %v %v %v %v %v %v]",datapkg[0],datapkg[1],datapkg[2],datapkg[3],datapkg[4],datapkg[5],datapkg[6],datapkg[7],datapkg[8],datapkg[9]))
fmt.Println(fmt.Sprintf("进行包装后的Protobuf实体数据: %v ",protoData))
//fmt.Println(fmt.Sprintf("进行包装后的完整二进制: %v ",datapkg))
return datapkg
}

//加密
func byteEncrypt(num int64,len int) []byte {
x :=num
byteData := make([]byte,len)
for i := 0; i < len; i++ {
byteData[i] = byte(x & 255) //进行与运算
x = x >> 8 //右移8位
}
return byteData
}

//解密
func byteDencrypt(byteData []byte,len int) int32 {
//测试位 []byte{48,191,8,0}
//4-1-0 = 3 byteData[3] = 0
//4-1-1 = 2 byteData[2] = 8
//4-1-2 = 1 byteData[1] = 191
//4-1-3 = 0 byteData[0] = 48
//取最后一位
x := int32(byteData[len-1])
//len-1为第一个数没有进行位移,所以去掉循环
for i := 0; i < len-1; i++ {
index :=len-1-i //反向取数
x=x<<8+int32(byteData[index-1]) //保存上次计算结果
//fmt.Println(x,i,index)
}
fmt.Println(x)
return x
}



func Uint8ToByte(num uint8) []byte {
var buf bytes.Buffer;
err:=binary.Write(&buf,binary.BigEndian,num)
fmt.Println(err)
return buf.Bytes()
}

func Int16ToByteBig(num int16) []byte {
var buf bytes.Buffer;
err:=binary.Write(&buf,binary.BigEndian,num)
fmt.Println(err)
return buf.Bytes()
}

func Int16ToByteLittle(num int16) []byte {
var buf bytes.Buffer;
err:=binary.Write(&buf,binary.LittleEndian,num)
fmt.Println(err)
return buf.Bytes()
}



func main(){
fmt.Println("WS listen: 0.0.0.0:7700")

//{"length":15,"type":1100,"protocol":9,"uid":0,"data":[10,3,176,254,34]}
//byteDencrypt([]byte{15,0},2) //15 & 255 =15 , 15 >> 8 = 0 [15,0]
//byteDencrypt([]byte{76,4},2) //1100 & 255 = 76 , 76 >> 8 = 4 [76,4]
//byteDencrypt([]byte{9,0},2) //9 & 255 = 9 , 9 >> 8 = 0 [9,0]
//byteDencrypt([]byte{0,0,0,0},4) //0 & 255 = 0 , 0 >> 8 = 0 [0,0,0,0]
//byteDencrypt([]byte{10,3,176,254,34},5) //protobuf struct []btyes

//加密测试
fmt.Println(byteEncrypt(1100,2))
fmt.Println(byteEncrypt(573232,4))
//解密测试
byteDencrypt([]byte{76,4},2) //1100
byteDencrypt([]byte{48,191,8,0},4) //573232


//测试加密
// for _,v := range []int{1,2,4,8}{
// fmt.Println(byteEncrypt(573232,v))
// }


// fmt.Println(byteEncrypt(10,2))
// fmt.Println(byteEncrypt(1000,2))
// fmt.Println(byteEncrypt(9,2))
// fmt.Println(byteEncrypt(10,4))

//构造二进制数据
// loginResponse := &LoginResponse{
// Result: 0,
// UserId: 573232,
// }
// data,_ := proto.Marshal(loginResponse)
// fmt.Println("proto结构二进制数据:",data)

// //返回给客户端的数据:{"length":14,"type":1000,"protocol":2,"uid":48944,"data":[16,176,254,34]}
// pkg:=pkgData(data,4) //测试包装数据 4->protobuf data struct len
// fmt.Println("返回给客户端的二进制数据:",pkg)


// k := Uint8ToByte(156)
// fmt.Println(k)
// k1 := Int16ToByteBig(156)
// fmt.Println("大端模式:",k1)
// k2 := Int16ToByteLittle(156)
// fmt.Println("小端模式:",k2)

// result := &ResultInfo{
// Cid: *proto.String("123457"),
// Error: *proto.String("hello"),
// ResultType: *proto.String("s"),
// Result: []byte("232244"),
// } // 进行编码
// data, _:= proto.Marshal(result)
// fmt.Println("编码:", data)

// newRI := &ResultInfo{}
// _ = proto.Unmarshal(data,newRI)
// fmt.Println("解码:",newRI)



//str := strings.Split("8,176,254,34,18,32,54,98,98,50,100,99,101,101,53,57,57,99,57,97,53,52,51,100,57,51,97,102,48,99,55,55,52,56,49,102,102,99",",")
//fmt.Println(str)

// byteData := make([]byte,len(str))
// for k,v := range str{
// fmt.Println(k,v)
// }



//newLogin := &LoginRequest{}
//_err := proto.Unmarshal(data,newLogin)
//fmt.Println(newLogin,_err)

http.HandleFunc("/ws",wsHandler)
http.ListenAndServe("0.0.0.0:7700",nil)

}

举报

相关推荐

0 条评论