今天准备写个最简单的加密聊天软件练练手。核心的就三样东西:
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
}
目前都测试通过了,可以开干了。