Total Pageviews

Sunday, 15 December 2019

加密算法对比

相信有很多小伙伴在使用V2Ray或者SSR的时候都这样的疑问,究竟哪种加密方式是最好的呢?要回答这个问题,就需要先知道什么是最好。对于加密方式/算法来说,一般安全性与性能呈负相关,越是安全越是对性能要求高,这应该是大家的常识。由于现在大部分给出的加密协议的安全性均能达到标准,因此这里主要讨论的便是加密性能的优良.
对于V2Ray而言,有三种加密方式:AES-128-CFB、AES-128-GCM、ChaCha20-Poly1305(当然还有不加密)。单看这三种加密方式,是非常具有代表性,可以说每种都有优缺点。若要讨论哪个更好,是需要逐个了解其原理是什么的。
AES加密方式
大家不难发现AES-128-CFB、AES-128-GCM均是AES-128-开头,很明显他们有着相似的特性。
AES(Advanced Encryption Standard)高级加密标准,这类加密标准是十分常见的对称加密算法。所谓的对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

 

具体的加密细节由于篇幅加之文章目的不再展示了。这里的AES-128就是密钥的长度为128位,加密轮数为10轮。此种方式在日常生活中应用极广,你现在看到了这篇文章,你就有可能在应用这类加密,因为无主界网站的HTTPS也是基于这种加密方式的。
AES-128-CFB
在知道了AES大概是什么后,相信大家就能猜到了AES-128-CFB、AES-128-GCM都是在AES加密方式下的不同的加密模式。那么两者又有怎样的差别呢?
对于CFB模式来说,其全称为Cipher FeedBack模式(密文反馈模式)。在CFB模式中,前一个密文分组会被送回到密码算法的输入端。而所谓反馈,这里指的就是返回输入端的意思。以下是其示意图:

 

从上图中可以发现,对于AES-128-CFB而言其优点在于它隐藏了明文模式,同时它可以及时加密传送小于分组的数据。但它也有缺点,CFB并不利于并行计算、一个明文单元损坏影响多个单元。
AES-128-GCM
对于GCM 模式来说,其全称为Galois/Counter Mode,也就是该对称加密采用Counter模式,并带有GMAC消息认证码。
其工作原理是相对较为复杂的,与CFB不同,它可以提供对消息的加密和完整性校验,另外,它还可以提供附加消息的完整性校验。以下是其粗略的示意图:

 

同样的笔者也不展开讨论了。这里依然说一下GCM的优缺点。对于GCM而言其最大的优势便是有利于并行计算,并且有消息的完整性校验。缺点自然是要考虑运行加密时硬件的支持程度。
ChaCha20-Poly1305
对于ChaCha20-Poly1305,其全称就是ChaCha20-Poly1305,它是由ChaCha20流密码和Poly1305消息认证码(MAC)结合的一种加密算法。
ChaCha20-Poly1305是基于RC4流加密的一种加密方式,它与AES有本质的区别,对于RC4而言,已经被证实并不安全,那么为什么还要发展ChaCha20-Poly1305呢?原因很简单,兼容性。
对于精简指令集的ARM平台,由于没有AES-NI指令集,ChaCha20-Poly1305在同等配置的手机中表现是AES的4倍(ARM v8之后加入了AES指令,所以在ARM v8平台上的设备,AES方式反而比chacha20-Poly1305方式更快,性能更好),这样可减少加密解密所产生的数据量,使得性能更好。
看到这里相信读者你似乎有了些眉目,对于加密方式的选择,与其讨论加密方式的优良,不如好好考虑你所在的实际应用场景是什么。
实际应用场景
对于V2Ray而言,由于其客户端受众甚广,因此在加密方式的选择中需要了解自身的实际需求。
对于普通用户而言,若V2Ray客户端运行在普通电脑上,很明显AES方式更加的高效。
若V2Ray客户端运行在手机或者软路由上,从上述描述中能很好的看到,AES和ChaCha20-Poly1305的选择需要依据实际情况。一般在近几年的手机/软路由CPU中都内置了AES-NI指令集,因此使用ChaCha20-Poly1305是没有必要的。但对于老手机而言,ChaCha20-Poly1305则快于AES,是你的最佳选择。
现在对于ChaCha20-Poly1305与AES的讨论告一段落了。那么对于AES-128-CFB与AES-128-GCM究竟哪个更好呢?这里就需要提到一个刚刚忽视了的细节:加密方式在V2Ray中是怎么运作的?
加密方式在V2Ray中的运作
在V2Ray的官网上的部分技术细节中有这样的描述:

 

从官方文档中可以发现,V2Ray尽可能的利用了加密方式的最大特点。这点很好,保证了加密方式得到合理的应用。在V2Ray文档也可以发现,所谓加密方式的选择其实是数据部分加密的选择,对于指令部分的加密(AES-128-CFB)是没法选择的。而文档的重点在于,在通讯过程中V2Ray会将数据分割为若干个小块,并逐一加密后发出。这便很好的为AES-128-CFB、AES-128-GCM该如何选择提供了依据。
对于安全来说,AES-128-CFB的数据完全加密更加有保证,但是就如上述所说,CFB本身并不适合并发,而V2Ray又会分割数据,这便牺牲了CFB的性能,导致连接速度下降。而对于AES-128-GCM而言,虽然没有也不可能加密整个数据部分,但由于其特点适合并发,因此反而能使得性能提升。
最后结论
这里笔者就根据上述的描述做一个小结。
对于服务端,一般选择Auto并且部分一键脚本没有给用户更改的机会,笔者也推荐在服务端直接使用Auto,在客户端中的选择需要慎重。
对于使用老旧手机的用户而言,毫无疑问,你需要选择ChaCha20-Poly1305或者直接选择不加密获得最佳性能。
对于使用电脑和近两年新手机的用户而言,选择AES-128-GCM效果最佳。
对于在乎自己数据安全的用户来说,选择AES-128-CFB,理论上能更加安全。