简单地说,服务端将一段数据 AES 加密,客户端接收到数据后解密。
伪代码展示:
// 从输入流里读取加密过的数据,解密后把原数据放到 bs 里
func (secureSocket *conn) DecodeRead(bs []byte) (data []byte, err error) {
n, err := secureSocket.Read(bs)
if err != nil {
fmt.Println("decode read: ", err)
return
}
fmt.Println("decode read: ", bs)
fmt.Println("decode read count: ", n)
data, err = secureSocket.Cipher.decode(bs[:n])
return
}
// 把放在 bs 里的数据加密后立即全部写入输出流
func (secureSocket *SecureTCPConn) EncodeWrite(bs []byte) (int, int, error) {
data, err := secureSocket.Cipher.encode(bs)
if err != nil {
return
}
writedCount, err := secureSocket.Write(data)
if err != nil {
return 0, 0, err
}
return writedCount, len(data), nil
}
环境使用 Mac,本地测试一切正常。加解密以及数据转发等都能正常进行。然后将服务端代码打包成 linux 执行文件丢到 VPS 中运行,出现了客户端解密失败,发现是因为客户端读取数据时,读取了多段字节,导致无法解密。
比如说就是,服务端依次发送,[1 2 3],[4 5 6]两端加密后的字段,客户端读取了[1 2 3 4 5 6]或者其他可能,并不是读取[1 2 3],然后[4 5 6]这样。所以无法解密。
因为服务端也是转发的数据,客户端无法确知加密后完整的一段数据长度时多少?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.