最简单的P2P加密聊天软件开发准备

今天准备写个最简单的加密聊天软件练练手。核心的就三样东西:

P2P通信

密钥交换

加密解密消息

暂时不支持图片等复杂的聊天功能,只支持字符聊天。

下面是我做的两个功能测试代码:

1. AES-128位加密解密

package research

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/hex"
	"io"
	"testing"
)

func TestAes(t *testing.T) {
	key := []byte("deadbeefdeadbeef")
	blk, err := aes.NewCipher(key[:])
	if err != nil {
		t.Error(err)
		return
	}

	aead, err := cipher.NewGCM(blk)
	if err != nil {
		t.Error(err)
		return
	}

	nonce := make([]byte, 12)
	if false {
		if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
			panic(err.Error())
		}
	}

	var encryptedMsg []byte
	var decryptedMsg []byte
	message := []byte("i love you!!")
	encryptedMsg = aead.Seal(nil, nonce, message, nil)
	t.Log(hex.EncodeToString(encryptedMsg))

	if decryptedMsg, err = aead.Open(nil, nonce, encryptedMsg, nil ); err != nil {
		t.Error(err)
		return
	}
	t.Log(string(decryptedMsg))

}

2. ECDSA密钥交换

package research

import (
	"encoding/hex"
	"github.com/btcsuite/btcd/btcec"
	"reflect"
	"testing"
)

func TestECDSA(t *testing.T) {
	priv1, pubKey1 := generateKeys(t)
	priv2, pubKey2 := generateKeys(t)

	commonKey1 := btcec.GenerateSharedSecret(priv1, pubKey2)
	commonKey2 := btcec.GenerateSharedSecret(priv2, pubKey1)

	if !reflect.DeepEqual(commonKey1, commonKey2) {
		t.Error("not equal")
		t.Error("commonKey1:", hex.EncodeToString(commonKey1))
		t.Error("commonKey2:", hex.EncodeToString(commonKey2))
	}
}

func generateKeys(t *testing.T) (*btcec.PrivateKey, *btcec.PublicKey) {
	priv, err := btcec.NewPrivateKey(btcec.S256())
	if err != nil {
		t.Error(err)
		return nil, nil
	}

	pubKey := btcec.PublicKey(priv.PublicKey)
	return priv, &pubKey
}

目前都测试通过了,可以开干了。

©️2020 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值