• Home
  • About
    • Shadow Knight photo

      Shadow Knight

      https://live.bilibili.com/9565678

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

go-RSA非对称加密-client

16 May 2018

Reading time ~1 minute

go-RSA非对称加密-client

公钥要互传才能互相发信息

package main

import (
	"net"
	"fmt"
	"log"
	"encoding/pem"
	"crypto/x509"
	"crypto/rsa"
	"crypto/rand"
)
var publicKey = []byte(`-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOHgtbakoBV283XEwaYElQvzZD3gj3pO
IVO7348N0cfhM5M0FRGJFKwByP8DThW73Pl6C93288DGlz+g5wn94/sCAwEAAQ==
-----END PUBLIC KEY-----`)
var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDfw1/P15GQzGGYvNwVmXIGGxea8Pb2wJcF7ZW7tmFdLSjOItn9
kvUsbQgS5yxx+f2sAv1ocxbPTsFdRc6yUTJdeQolDOkEzNP0B8XKm+Lxy4giwwR5
LJQTANkqe4w/d9u129bRhTu/SUzSUIr65zZ/s6TUGQD6QzKY1Y8xS+FoQQIDAQAB
AoGAbSNg7wHomORm0dWDzvEpwTqjl8nh2tZyksyf1I+PC6BEH8613k04UfPYFUg1
0F2rUaOfr7s6q+BwxaqPtz+NPUotMjeVrEmmYM4rrYkrnd0lRiAxmkQUBlLrCBiF
u+bluDkHXF7+TUfJm4AZAvbtR2wO5DUAOZ244FfJueYyZHECQQD+V5/WrgKkBlYy
XhioQBXff7TLCrmMlUziJcQ295kIn8n1GaKzunJkhreoMbiRe0hpIIgPYb9E57tT
/mP/MoYtAkEA4Ti6XiOXgxzV5gcB+fhJyb8PJCVkgP2wg0OQp2DKPp+5xsmRuUXv
720oExv92jv6X65x631VGjDmfJNb99wq5QJBAMSHUKrBqqizfMdOjh7z5fLc6wY5
M0a91rqoFAWlLErNrXAGbwIRf3LN5fvA76z6ZelViczY6sKDjOxKFVqL38ECQG0S
pxdOT2M9BM45GJjxyPJ+qBuOTGU391Mq1pRpCKlZe4QtPHioyTGAAMd4Z/FX2MKb
3in48c0UX5t3VjPsmY0CQQCc1jmEoB83JmTHYByvDpc8kzsD8+GmiPVrausrjj4p
y2DQpGmUic2zqCxl6qXMpBGtFEhrUbKhOiVOJbRNGvWW
-----END RSA PRIVATE KEY-----`)


//加密函数
func RsaEncrypt(origData [] byte) [] byte {
	//公钥加密
	block ,_:= pem.Decode(publicKey)
	//解析公钥
	pubInterface ,_:=x509.ParsePKIXPublicKey(block.Bytes)
	//设置刚才公钥为public key 类型断言
	pub:= pubInterface.(*rsa.PublicKey)
	//加密[]byte("hello world")明文
	bts,_:=rsa.EncryptPKCS1v15(rand.Reader,pub,origData)
	return  bts
}

//解密函数
func RsaDecrypt(origData []byte) [] byte {
	//通过私钥解密
	block ,_:=pem.Decode(privateKey)
	//解析私钥
	priv,_:=x509.ParsePKCS1PrivateKey(block.Bytes)
	//解码
	bts,_:=rsa.DecryptPKCS1v15(rand.Reader,priv,origData)
	return  bts

}

func main() {
	//1.提供服务器地址
	tcpAddr, _ := net.ResolveTCPAddr("tcp4", "10.0.154.250:9527")
	//2.连接
	tcpConn, _ := net.DialTCP("tcp", nil, tcpAddr)
	defer tcpConn.Close()
	//*TCPConn
	//交互数据:
	handleData(tcpConn)
}


func handleData(tcpConn *net.TCPConn){

	overChan := make(chan  bool)
	go func() {
		for {
			//读取服务器

			bs := make([] byte, 512)
			n,_:= tcpConn.Read(bs) //阻塞式
			message := string(bs[:n])
			if n == 0{
				log.Fatal("客户端即将结束。。")
			}
			fmt.Println("服务器说:", message)
			var lin = RsaDecrypt([]byte(message))
			fmt.Println(string(lin))
		}
	}()

	go func() {
		for {
			//读取键盘

			line := ""
			id:=""
			fmt.Scanln(&id) //键盘输入,阻塞的
			fmt.Scanln(&line) //键盘输入,阻塞的
			 
			fmt.Println("输入了:", line)

			//var ss = RsaEncrypt([]byte(line))
			//写给服务器
			var lin =RsaEncrypt([]byte(line))
			ssd:=fmt.Sprintf("%s:%s",id,lin)
			ss:=string(id)+":"+string(lin)
			tcpConn.Write([]byte(ssd))
			fmt.Println(ss)
			if line == "over"{
				log.Fatal("客户端即将结束。。")
			}
		}
	}()

	<- overChan
}



go-RSA非对称加密client Share Tweet +1