代理协议

代理协议

记录下自己实现基于tcp传输和aes-256-cfb加密的shadowsocks协议时所遇的一些问题

aes-256-cfb加密

该算法需要16byte的iv向量和32byte的密钥进行加密,加密的原文没有长度的限制,解密时可以分段解密,使用这种加密算法可以对tcp流进行加密而不需要增加额外的信息

基于tcp的连接

1
2
3
4
5
C->S : stream

stream = iv + playload

playload = aes-256-cfb(type + address + port + data)

注:

1
aes-256-cfb(type + address + port+ data) = aes-256-cfb(type + address + port) + aes-256-cfb(data)
Name Length Desc
iv 16 用于解密
type 1 1为ipv4 3为域名 4 为ipv6
address x 长度根据type而定 1: 4 ([255,1, 1, 1]), 3: 1+len(hostname) ([3, ‘w’, ‘w’, ‘w’]) ,4: 16
port 2 大端模式(443=[1, 187])
1
2
3
4
5
S->C : stream

stream = iv + playload

playload = aes-256-cfb(data)

以上所有长度均以byte为单位,S收到C的stream后会使用iv解密playload得到需要进行的tcp连接,完成类似https代理的打洞,之后C发送的所有tcp流加密后直接发送到S即可,如果需要连接不同的address需要建立新的tcp连接。S向C端发送时需要注意此时iv是S端的和C->S的iv无关,C端收到的流需要使用这个iv进行解密,C端收到的playload仅为加密后的tcp流