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

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

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

对于 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. matplotlib学习日记(四)-绘制直方统计图形

    (一)柱状图-应用在定性数据的可视化场景或者离散型数据,条形图和柱状图相似,只不过是函数barh import matplotlib as mpl import matplotlib.pyplot a ...

  2. 【linux】系统编程-2-消息队列

    目录 前言 4. 消息队列 4.1 概念 4.2 对比 4.3 函数及使用流程 4.3.1 msgget() 4.3.2 msgsng() 4.3.3 msgrcv() 4.3.4 msgctl() ...

  3. [leetcode]Next Greater Element

    第一题:寻找子集合中每个元素在原集合中右边第一个比它大的数. 想到了用哈希表存这个数的位置,但是没有想到可以直接用哈希表存next great,用栈存还没找到的数,没遍历一个数就考察栈中的元素小,小的 ...

  4. python谷歌序列化传输

    今日破解某app加密app当中用到了谷歌序列化传输 1.请求序列化文件 # Generated by the protocol buffer compiler. DO NOT EDIT! # sour ...

  5. ThreadLocal源码深度剖析

    ThreadLocal源码深度剖析 ThreadLocal的作用 ThreadLocal的作用是提供线程内的局部变量,说白了,就是在各线程内部创建一个变量的副本,相比于使用各种锁机制访问变量,Thre ...

  6. IT 界那些朗朗上口的“名言

    中国有很多古代警世名言,朗朗上口,凝聚了很多故事与哲理.硅谷的互联网公司里头也有一些这样的名言,凝聚了很多公司价值观和做事的方法,对于很多程序员来说,其影响潜移默化.这里收集了一些,如下. Stay ...

  7. ASP.NET Core路由中间件[1]: 终结点与URL的映射

    目录 一.路由注册 二.设置内联约束 三.默认路由参数 四.特殊的路由参数 借助路由系统提供的请求URL模式与对应终结点(Endpoint)之间的映射关系,我们可以将具有相同URL模式的请求分发给应用 ...

  8. Beta冲刺——第六天

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  9. Hbase之过滤器的使用

    一.过滤器概念 基础API中的查询操作在面对大量数据的时候是非常物无力的,这里Hbase提供了高级的查询方法:Filter(过滤器).过滤器可以根据簇.列.版本等更多的条件来对数据进行过滤,基于Hba ...

  10. 查找Command

    Find [路径] [匹配表达式] -name filename : 查找指定名称的文件 -user username: 查找属于指定用户的文件 -group grpname: 查找属于指定组的文件 ...