OpenSSL 常见对称加密算法特性分析
在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢?
对于加密方式、算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高。
现在主流的加密协议的安全性均能达到标准,因此这里主要讨论的最好便是加密性能的优良。
对于 OpenSSL 而言,有三种常见的加密方式:RC4、AES、ChaCha。
单看这三种加密方式,都是非常具有代表性,可以说每种都有优缺点。
AEAD
在传统的对称加密协议中,最大的缺陷就是没有对数据包完整性进行校验,再加上流加密的特点,导致了攻击者可以通过穷举的方式修改密文进行基于服务器行为的主动探测。
在通常的密码学应用中,Confidentiality(保密)用加密实现,消息认证用 MAC(Message Authentication Code,消息验证码)实现。这两种算法的配合方式,引发了很多安全漏洞,过去曾经有 3 种方法:
- Encrypt-and-MAC (E&M)
- MAC-then-Encrypt (MtE) <- 即 OTA 的做法
- 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 常见对称加密算法特性分析的更多相关文章
- openssl 对称加密算法enc命令详解
1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...
- 第七章 对称加密算法--DES
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...
- .NET Core加解密实战系列之——对称加密算法
简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...
- Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解
Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解 说明:Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解,加密算法,是现在每个软件项目里必须用到的内容. 广泛应用在包括 ...
- openssl ans.1编码规则分析及证书密钥编码方式
1 数据编码格式 openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释 ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语 ...
- java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4
概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...
- openssl enc(对称加密)
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 对称加密工具.了解对称加密的原理后就很简单了,原理部分见下文. openss ...
- (9) openssl enc(对称加密)
对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl enc -ciphername [-in filename] [-out filename] [-pa ...
- 使用java库中的对称加密算法
对称加密算法是说加密方和解密方使用相同的密钥.常见的对称加密算法包括4个,DES,DESede(3DES),AES,PBE. 本文讨论的内容是加密算法,不是Message Digest,不是编码.下面 ...
随机推荐
- 私有Maven仓库安装和使用
安装 这里选择安装的是windows平台,linux安装类似,下载可能要梯子 官网下载页 https://help.sonatype.com/repomanager2/download 下载链接 ht ...
- [leetcode]168. Excel Sheet Column Title表格列名编码(十进制和多进制相互转换)
其实就是一道,十进制转多进制的题 十进制转多进制就是从后边一位一位地取数. 这种题的做法是,每次用n%进制,相当于留下了最后一位,然后把这位添加到结果最前边.结果需要转为进制的符号. 下一次循环的n变 ...
- device_create为何可以在/sys/class/具体类/属性文件?怎么实现的
答案: 版本3.6.9: device_create -> device_register -> device_add -> device_add_attrs -> devic ...
- ESP32 BLE蓝牙 微信小程序通信发送大于20字符数据
由于微信小程序只支持BLE每次发送数据不大于20个字节,ESP32则有经典蓝牙.低功耗蓝牙两种模式. 要解决发送数据大于20个字节的问题,最简单实用的方式就是分包发送.如下图所示: 1.什么起始字符和 ...
- Javaweb前台界面代码复用总结
servlet声明定义message信息传给前天界面判断输出message: if(booknamelist.size()==0) { message="根据书名查询没有结果!"; ...
- 无延时去斗按键实现方法(不好CPU)
这一灵感来源于定时器计数的方法,最后可以实现的效果跟咱们电脑键盘按键的效果一样!我先来介绍下基本原理吧! 采用定时器中断的方法,比如定时器终端我们设置为5ms,我们需要按键按下超过40ms时才算有按键 ...
- OpenGL投影矩阵(Projection Matrix)构造方法
(翻译,图片也来自原文) 一.概述 绝大部分计算机的显示器是二维的(a 2D surface).在OpenGL中一个3D场景需要被投影到屏幕上成为一个2D图像(image).这称为投影变换(参见这或这 ...
- JAVA JVM助记符
ldc:将int/float/String类型的常量值从常量池中推送至栈顶(栈顶的值是即将要用的) bipush:将单字节(-128 ~ 127)的常量值从常量池中推至栈顶 sipush:将一个短整型 ...
- python之random 、os 、sys 模块
一.random模块 import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3 ...
- Spring Boot 2.x基础教程:多个文件的上传
昨天,我们介绍了如何在Spring Boot中实现文件的上传.有读者问:那么如果有多个文件要同时上传呢?这就马上奉上,当碰到多个文件要同时上传的处理方法. 动手试试 本文的动手环节将基于Spring ...