代理协议
代理协议
记录下自己实现基于tcp传输和aes-256-cfb加密的shadowsocks协议时所遇的一些问题
aes-256-cfb加密
该算法需要16byte的iv向量和32byte的密钥进行加密,加密的原文没有长度的限制,解密时可以分段解密,使用这种加密算法可以对tcp流进行加密而不需要增加额外的信息
基于tcp的连接
1 | C->S : stream |
注:
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 | S->C : stream |
以上所有长度均以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流