在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢?

对于加密方式、算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高。

现在主流的加密协议的安全性均能达到标准,因此这里主要讨论的最好便是加密性能的优良。

对于 OpenSSL 而言,有三种常见的加密方式:RC4、AES、ChaCha。

单看这三种加密方式,都是非常具有代表性,可以说每种都有优缺点。

AEAD

在传统的对称加密协议中,最大的缺陷就是没有对数据包完整性进行校验,再加上流加密的特点,导致了攻击者可以通过穷举的方式修改密文进行基于服务器行为的主动探测。

在通常的密码学应用中,Confidentiality(保密)用加密实现,消息认证用 MAC(Message Authentication Code,消息验证码)实现。这两种算法的配合方式,引发了很多安全漏洞,过去曾经有 3 种方法:

  1. Encrypt-and-MAC (E&M)
  2. MAC-then-Encrypt (MtE) <- 即 OTA 的做法
  3. Encrypt-then-MAC (EtM) <- 新协议的做法

然而后来人们发现,E&M 和 MtE 都是有安全问题的,所以 2008 年起, 逐渐提出了「用一个算法在内部同时实现加密和认证」的反法,称为 AEAD (Authenticated Encryption with Associated Data)。在 AEAD 这种概念里,cipher + MAC 的模式被一个 AEAD 算法替换。

使用了 AEAD 算法的新协议本质上就是更完善的 stream cipher + authentication,虽然它依然使用的是流加密(StreamCipher),但是通过更完善的数据包完整性验证机制杜绝了上面所述的可被篡改密文的可能性。

目前以下加密方式支持 AEAD 算法:

  • AES-128-GCM
  • AES-192-GCM
  • AES-256-GCM
  • ChaCha20-IETF-Poly1305
  • XChaCha20-IETF-Poly1305

但如果是用在路由器上,因为很多路由器 CPU 速度都在 500MHz 以下,并且不支持 AES 硬解,因为在路由器等计算能力弱的设备上使用 AES 加密方式会造成性能影响,所以,之前使用在路由器上的加密方式一般都选 ChaCha20 算法或 RC4-MD5 (特别是 MIPS 架构的处理器)。

性能

支持 AES 指令集情况下:

  • 更快(Fast)
  • RC4-MD5
  • AES-256-CFB
  • AES-256-GCM
  • ChaCha20
  • ChaCha20-IETF-Poly1305
  • XChaCha20-IETF-Poly1305
  • 更慢(Slow)

不支持 AES 指令集情况下:

  • 更快(Fast)
  • RC4-MD5
  • ChaCha20
  • ChaCha20-IETF-Poly1305
  • XChaCha20-IETF-Poly1305
  • AES-256-CFB
  • AES-256-GCM
  • 更慢(Slow)

在各类处理器的测试数据:

Chip AES-128-GCM 速度 ChaCha20-Poly1305 速度
OMAP 4460 24.1 MB/s 75.3 MB/s
Snapdragon S4 Pro 41.5 MB/s 130.9 MB/s
Sandy Bridge Xeon (AES-NI) 900 MB/s 500 MB/s

RC4 加密

速度最快,加密简单易破解,适合内网、低性能设备,推荐使用 RC4-MD5。

  • RC4-MD5:使用 RC4 加密 MD5 校验。

AES 加密

块加密算法,兼顾效率和安全,适合在拥有 AES 指令集的 CPU 上,推荐使用 AES-256-GCM 。

区别 AES-XXX-CFB AES-XXX-CTR AES-XXX-GCM
区别 仅加密 仅加密 加密+消息完整性校验
优点 加密可并行 加密解密均可并行计算 加密解密均可并行计算
缺点 解密串行
  • AES-256-CFB:密码反馈模式(Cipher FeedBack Mode),仅加密无完整性校验。

  • AES-256-CTR:计算器模式(Counter Mode),仅加密无完整性校验。

  • AES-256-GCM:伽罗瓦 / 计数器模式(Galois / Counter Mode)支持 AEAD 认证加密,同时完成加密和完整性校验。

ChaCha 加密

新型的流加密算法,兼顾效率和安全,适合在没有 AES 指令集的 CPU 上,效率比 AES 高,推荐使用 XChaCha20-IETF-Poly1305 。

  • ChaCha20:Salsa20 算法的改良,仅加密无完整性校验。

  • ChaCha20-IETF-Poly1305:支持 AEAD 认证加密,同时完成加密和完整性校验。

  • XChaCha20-IETF-Poly1305:是前者的升级版,拥有更大的随机数以防碰撞攻击,支持 AEAD 认证加密,同时完成加密和完整性校验。

总结

  • 在具备 AES 加速的 CPU(例如桌面、服务器)上,建议使用 AES-256-GCM 系列。

  • 在移动设备(例如手机、路由器等非 x86 架构的 CPU)上则建议使用 ChaCha20-IETF-Poly1305 系列。

  • 如果你是在内网(LAN 或 IPLC 线路)使用,则不必过多担心安全性问题,RC4-MD5 加密协议将是非常节省性能的选择。

OpenSSL 常见对称加密算法特性分析的更多相关文章

  1. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  2. 第七章 对称加密算法--DES

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...

  3. .NET Core加解密实战系列之——对称加密算法

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

  4. Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解

    Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解 说明:Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解,加密算法,是现在每个软件项目里必须用到的内容. 广泛应用在包括 ...

  5. openssl ans.1编码规则分析及证书密钥编码方式

    1 数据编码格式 openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释 ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语 ...

  6. java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

    概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...

  7. openssl enc(对称加密)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 对称加密工具.了解对称加密的原理后就很简单了,原理部分见下文. openss ...

  8. (9) openssl enc(对称加密)

    对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl   enc  -ciphername   [-in filename]   [-out filename]   [-pa ...

  9. 使用java库中的对称加密算法

    对称加密算法是说加密方和解密方使用相同的密钥.常见的对称加密算法包括4个,DES,DESede(3DES),AES,PBE. 本文讨论的内容是加密算法,不是Message Digest,不是编码.下面 ...

随机推荐

  1. 使用IDE练习插件【廖雪峰】

    使用廖雪峰大神的插件,安装过程中,一直出现问题,然后在他的Java教程下面看大家的评论也有点晕了(很多人说的是jar包,结果其实是下的依旧是zip包) 最终解决方法: 将zip包解压到同名文件夹中,再 ...

  2. python-OpenCV 使用GrabCut来实现图片的前景与后景的分割

    先上一个效果图: 使用Python3.7+OpenCV 3.x. 需要引入 numpy库. 在图上用鼠标左键和右键标记前景和后景即可.如果需要重新标记图像,关闭程序重新运行. 以下是具体实现代码. # ...

  3. python-使用python获取一段录音

    需要安装pyaudio库. 直接上代码: import pyaudio import wave AUDIO_FILE = '录音文件.wav' def get_audio(filepath, audi ...

  4. Linux音频编程--使用ALSA库播放wav文件

    在UBUNTU系统上使用alsa库完成了对外播放的wav文件的案例. 案例代码: /** *test.c * *注意:这个例子在Ubuntu 12.04.1环境下编译运行成功. * */ #inclu ...

  5. leetcode网站中找到的关于trie树的JAVA版本介绍

    class TrieNode { // R links to node children private TrieNode[] links; private final int R = 26; pri ...

  6. java13编程基础之数组深入

    大纲一维数组概述数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们. 这些按序排列 ...

  7. String被final修饰

    源码:

  8. SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...

  9. ethernet

    OSI参考模型 简化相关网络操作:提供不同厂商之间的互联 应用层 为应用程序提供服务 HTTP Telnet 表示层 数据格式化,加密.解密 ASCII EBCDIC JPEG 会话层 建立.维护.管 ...

  10. js 中const 定义的值是否能更改

    const定义的基本类型不能改变,但是定义的对象是可以通过修改对象属性等方法来改变的. 1. const aa=trueaa=falseconsole.log(aa)VM1089:2 Uncaught ...