需要加密 tcp 连接。我正在尝试覆盖 conn net.Conn 对象的 Read 方法
type Stream struct {
conn net.Conn
alg algorithms.CipherAlgorithm
}
func (s *Stream) Read(p []byte) (n int, err error) {
var buf bytes.Buffer
len, err := buf.ReadFrom(s.conn)
if err != nil {
return 0, err
}
p, err = s.alg.Decrypt(buf.Bytes())
if err != nil {
return 0, err
}
return int(len), err
}
func (s *Stream) Write(p []byte) (n int, err error) {
ciphertext, err := s.alg.Encrypt(p)
if err != nil {
return 0, err
}
return s.conn.Write(ciphertext)
}
当我尝试从套接字读取消息并解码 json
encriptedConnection := encription.NewStream(conn, &algorithms.DES{symmetricKey})
var credentials struct{ Login, Password string }
err = json.NewDecoder(encriptedConnection).Decode(&credentials)
if err != nil {
log.Println(err.Error())
}
我收到这样的错误
2018/04/03 19:59:17 invalid character '\x00' looking for beginning of value
问题是如何更改从 tcp 套接字读取的内容?
你在这里有两个问题:
1 无论传入介质 p 的容量如何,都从连接中减去所有可用数据。如果您有编码和解码的数据,允许您逐字节解码,而不改变长度,您需要做这样的事情
如果上游读取器通过一个小缓冲区,则只读取所需数量的数据并且不会丢失它们的尾部。
每行 2 个
[]byte 不是数组,而是数据结构:指向数组的指针,长度,容量。
在这一行中,不是将数据写入原始切片,将原始数组写入 p,而是为 p 分配一个指向新数组的新结构,但是由于 p 是通过副本传递的(在 go 中,所有参数都是通过副本传递的)按值,包括指针 - 它们也被复制)。调用函数对新数组一无所知。在这里,您需要执行以下操作:
好吧,或者 Decrypt 对读者做类似的事情——让他立即将数据写入所需的切片。