各大加密算法对比(原理性能安全运用)

Posted 时间在手上,需要抓住

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各大加密算法对比(原理性能安全运用)相关的知识,希望对你有一定的参考价值。

原理

按加密可逆可以分为:加密可逆算法和加密不可逆算法。加密可逆算法又可以分为:对称加密和非对称加密。

1、加密不可逆算法:一般采用hash算法加密,其原理一般是将原文长度补位成64的倍数,接着初始化固定长度的缓存值,经过循环与分组后的明文进行 与操作、或操作、非操作、异或操作 改变缓存值,最后的缓存值就是密文。该算法加密得到的密文是没有解密算法的,是不可逆的。常见的不可逆算法有:MD5,SHA、SM3。

2、对称加密算法:加密解密密钥相同,明文加密成密文后,密文是可以通过解密恢复原文的,其原理一般是将原文分组,经过 原文位置调换、密钥生成、原文与密钥进行轮函数(异或运算、多项式运算等)处理、分组单元进行字典表置换或位置换 等操作,将明文转化成密文。一般解密使用逆函数、返位移或字典表操作可以将密文转化为原文。常见的对称加密算法有:DES、3DES、AES、SM4、RC4、TEA、IDEA。

3、非对称加密算法:加密解密的密钥不同,其原理一般是用复杂的数学难题来做公钥私钥。即是获取了公钥,也很难计算出私钥。而且这些组成公钥私钥的数字在特定公式下,能将原文(O)和密文(C)相互转化。比如RSA的公钥(E,N)和私钥(D,N)都由两个数组成,但能通过公式 C= mod N以及 O= mod N 相互转化密文和原文。常见的非对称加密算法有:RSA、ECC。

性能

原理分析:非对称采用原文与缓存值hash函数循环进行与或非等操作,返回值也小,速度应该是最快的。而对称加密需要按位或分组与密钥进行轮函数处理,速度应该慢于不可逆加密算法。非对称加密算法由于计算量巨大,应该是最慢的。

实测:本次实测以Hutool工具的加密算法为准,测试md5、sha-256、des、aes、rsa的性能,分别测试它们在不同数量级原文下的加密速度。测试代码如下:

package com.longqi.bootsecurity;

import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import org.apache.commons.lang3.RandomStringUtils;

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.List;

/**
 * @author LQ
 * @projectName boot-integration
 * @description: 加密测试
 * @date 2023/3/2 20:35
 */
public class Application 

    public static void main(String[] args) 
        int len = 100;
        // 准备11个原文,每个算法第一次运行时间不记录,运行时间为后10次的平均值。
        List<String> dataList = new ArrayList<>(16);
        for (int i=0;i<11;i++)
            dataList.add(RandomStringUtils.randomAlphanumeric(len));
        
        System.out.println("原文长度:"+len);
        System.out.println("原文:"+dataList.get(0));
        // 不可逆加密
        md5(dataList);
        sha256(dataList);
        // 对称加密
        des(dataList);
        aes(dataList);
        // 非对称加密
        rsa(dataList);
    


    public static void md5(List<String> dataList)
        String encode = SecureUtil.md5(dataList.get(0));
        long startTime = System.nanoTime();
        for(int i=1;i<11;i++)
            SecureUtil.md5(dataList.get(i));
        
        long endTime = System.nanoTime();
        System.out.println("MD5耗时:"+(endTime-startTime)/10+"ns");
        System.out.println("MD5密文:"+encode);
    

    public static void sha256(List<String> dataList)
        String encode = SecureUtil.sha256(dataList.get(0));
        long startTime = System.nanoTime();
        for(int i=1;i<11;i++)
            SecureUtil.sha256(dataList.get(i));
        
        long endTime = System.nanoTime();
        System.out.println("SHA256耗时:"+(endTime-startTime)/10+"ns");
        System.out.println("SHA256密文:"+encode);
    

    public static void des(List<String> dataList)
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
        System.out.println("DES密钥:"+ HexUtil.encodeHexStr(key));
        DES des = SecureUtil.des(key);
        String encode = des.encryptHex(dataList.get(0));
        long startTime = System.nanoTime();
        for(int i=1;i<11;i++)
            des.encryptHex(dataList.get(i));
        
        long endTime = System.nanoTime();
        System.out.println("DES耗时:"+(endTime-startTime)/10+"ns");
        System.out.println("DES密文:"+encode);
    

    public static void aes(List<String> dataList)
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        System.out.println("AES密钥:"+ HexUtil.encodeHexStr(key));
        AES aes = SecureUtil.aes(key);
        String encode = aes.encryptHex(dataList.get(0));
        long startTime = System.nanoTime();
        for(int i=1;i<11;i++)
            aes.encryptHex(dataList.get(i));
        
        long endTime = System.nanoTime();
        System.out.println("AES耗时:"+(endTime-startTime)/10+"ns");
        System.out.println("AES密文:"+encode);
    

    public static void rsa(List<String> dataList)
        KeyPair pair = SecureUtil.generateKeyPair("RSA");
        PrivateKey privateKey = pair.getPrivate();
        PublicKey publicKey = pair.getPublic();
        System.out.println("RSA公钥:"+ publicKey.toString());
        System.out.println("RSA私钥:"+ privateKey.toString());
        RSA rsa = SecureUtil.rsa(privateKey.getEncoded(),publicKey.getEncoded());
        String encode = rsa.encryptHex(dataList.get(0), KeyType.PublicKey);
        long startTime = System.nanoTime();
        for(int i=1;i<11;i++)
            rsa.encryptHex(dataList.get(i), KeyType.PublicKey);
        
        long endTime = System.nanoTime();
        System.out.println("RSA耗时:"+(endTime-startTime)/10+"ns");
        System.out.println("RSA密文:"+encode);
    



运行会打印 原文、密文、耗时,密钥,其中的耗时第一次耗时不计算,以各算法后10次平均值打印具体如下:

1、以下是10次加密长度100字符各加密算法的平均耗时(纳秒):

加密100长度字符,在处理同批次明文,密钥确定的情况下:AES性能最强、接着是MD5和RSA性能次之,最后是SHA-256与DES性能最差。当然,差距不大,最好与最坏也就3倍差距,最慢需要0.23毫秒。这里的字符空间大小为:100字节(Byte),即约为0.09765KB,最慢需要0.2毫秒。

2、以下是10次加密长度1000000的字符各加密算法的平均耗时(纳秒):

可以看出:AES与MD5性能最强,两者相差很小,然后是SHA-256和DES性能次之,最后RSA性能最慢,和别的算法差距明显。这里的字符空间大小为:1000000字节,即约为976.56KB,最慢需要0.2秒。

3、以下是10次加密长度100000000的字符各加密算法的平均耗时(豪秒),这里时间耗费较长,只统计5次:

可以看出:AES与MD5性能最强,两者相差很小,然后是SHA-256和DES性能次之,最后RSA性能最慢,和别的算法差距明显。这里的字符空间大小为:100000000字节,即约为95.37MB,最慢需要24秒。

总结:性能排名:AES、MD5、SHA-256、DES、RSA。具体分析如下:

AES:凭借分组整体替换,每次循环处理更多原文数据,即使需要密钥参与运算,还是能和MD5速度处于同一水平线上甚至略胜一点点。

MD5:虽然哈希算法里每次是3个32位字的原文与缓存值进行运算,虽然不需要密钥参与运算,但性能并没有与AES拉开差距,主要原因是每次处理的原文没有AES多。

SHA-256:和MD5相比,每次处理的字数不变,缓存值更多,算法更复杂,比MD5慢是正常的。

DES:由于没有分组处理,仅仅是按位替换,每次循环处理的原文数据少,再加上密钥需要参与运算,比不可逆算法慢是正常的。

RSA:基本符合预期,数据量少计算量小,凭借最简洁的运算,耗费时间少,但数据量一大,运算量大,就被拉开明显差距了。

安全

这里先讨论下各算法根据密文得到原文的加密或解密次数。

MD5:该算法不可逆,破解只能靠穷举法,而且原文越大,时间越长些,密文输出128bit,范围是2的128次方,即最长需要穷举原文加密次才能破解。

SHA-256:与MD5类似,破解只能靠穷举法,密文输出256bit,范围是2的256次方,即最长需要穷举原文加密次才能破解。

DES:该算法密钥只有56位有效,有密文后解密速度恒定,需要穷举密钥解密次才能破解。

AES:该算法密钥有128、192、256位,再只有密文的情况下,这三种密钥都得穷举,最长得解密才破解。

RSA:该算法密钥有512、1024、2048位,光穷举密钥就得运行次,再加上该算法加密解密耗时长,破解异常困难。

以上算法安全性是:RSA>SHA-256=>AES>MD5>DES。

运用

MD5:由于速度快,雪崩效应,返回值固定。常用于文件或数据校验。

SHA-256:由于速度比MD5稍慢,雪崩效应,返回值固定,且安全性远大于MD5,也不担心密钥暴露。可用于文件或数据校验,保存密码。

DES:该算法已淘汰,速度慢,安全性差,现在基本没有运用了。

AES:由于速度快,算法可逆,安全性高(不暴露密钥的话),可用于加密传输信息。

RSA:由于安全性高,算法可逆,有公钥和私钥,但大量数据下加密解密慢,可用于验签、加密传输少量信息。

常见加密算法原理及概念

参考技术A

在安全领域,利用密钥加密算法来对通信的过程进行加密是一种常见的安全手段。利用该手段能够保障数据安全通信的三个目标:

而常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。下面我们来了解下相关的算法原理及其常见的算法。

对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。由于加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程出现了密钥泄露,不怀好意的人就能结合相应的算法拦截解密出其加密传输的内容。

对称加密算法拥有着算法公开、计算量小、加密速度和效率高得特定,但是也有着密钥单一、密钥管理困难等缺点。

常见的对称加密算法有:
DES:分组式加密算法,以64位为分组对数据加密,加解密使用同一个算法。
3DES:三重数据加密算法,对每个数据块应用三次DES加密算法。
AES:高级加密标准算法,是美国联邦政府采用的一种区块加密标准,用于替代原先的DES,目前已被广泛应用。
Blowfish:Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。

非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥才能解密,反之亦然。
下图为简单非对称加密算法的常见流程:

发送方Bob从接收方Alice获取其对应的公钥,并结合相应的非对称算法将明文加密后发送给Alice;Alice接收到加密的密文后,结合自己的私钥和非对称算法解密得到明文。这种简单的非对称加密算法的应用其安全性比对称加密算法来说要高,但是其不足之处在于无法确认公钥的来源合法性以及数据的完整性。
非对称加密算法具有安全性高、算法强度负复杂的优点,其缺点为加解密耗时长、速度慢,只适合对少量数据进行加密,其常见算法包括:
RSA :RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,可用于加密,也能用于签名。
DSA :数字签名算法,仅能用于签名,不能用于加解密。
DSS :数字签名标准,技能用于签名,也可以用于加解密。
ELGamal :利用离散对数的原理对数据进行加解密或数据签名,其速度是最慢的。

单向加密算法常用于提取数据指纹,验证数据的完整性。发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。接收方在收到加密的报文后进行解密,将解密获取到的明文使用相同的单向加密算法进行加密,得出加密后的密文串。随后将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应。常见的算法包括:MD5、sha1、sha224等等,其常见用途包括:数字摘要、数字签名等等。

密钥交换IKE(Internet Key Exchange)通常是指双方通过交换密钥来实现数据加密和解密,常见的密钥交换方式有下面两种:
1、公钥加密,将公钥加密后通过网络传输到对方进行解密,这种方式缺点在于具有很大的可能性被拦截破解,因此不常用;
2、Diffie-Hellman,DH算法是一种密钥交换算法,其既不用于加密,也不产生数字签名。DH算法的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。DH算法通过双方共有的参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双方计算后的结果是相同的,此结果即为密钥。
如:

在整个过程中,第三方人员只能获取p、g两个值,AB双方交换的是计算后的结果,因此这种方式是很安全的。

公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合,用于实现基于公钥密码机制的密钥和证书的生成、管理、存储、分发和撤销的功能,其组成包括:签证机构CA、注册机构RA、证书吊销列表CRL和证书存取库CB。
PKI采用证书管理公钥,通过第三方可信任CA中心,把用户的公钥和其他用户信息组生成证书,用于验证用户的身份。
公钥证书是以数字签名的方式声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务身份。公钥证书的生成遵循X.509协议的规定,其内容包括:证书名称、证书版本、序列号、算法标识、颁发者、有效期、有效起始日期、有效终止日期、公钥 、证书签名等等的内容。

CA证书认证的流程如下图,Bob为了向Alice证明自己是Bob和某个公钥是自己的,她便向一个Bob和Alice都信任的CA机构申请证书,Bob先自己生成了一对密钥对(私钥和公钥),把自己的私钥保存在自己电脑上,然后把公钥给CA申请证书,CA接受申请于是给Bob颁发了一个数字证书,证书中包含了Bob的那个公钥以及其它身份信息,当然,CA会计算这些信息的消息摘要并用自己的私钥加密消息摘要(数字签名)一并附在Bob的证书上,以此来证明这个证书就是CA自己颁发的。Alice得到Bob的证书后用CA的证书(自签署的)中的公钥来解密消息摘要,随后将摘要和Bob的公钥发送到CA服务器上进行核对。CA在接收到Alice的核对请求后,会根据Alice提供的信息核对Bob的证书是否合法,如果确认合法则回复Alice证书合法。Alice收到CA的确认回复后,再去使用从证书中获取的Bob的公钥加密邮件然后发送给Bob,Bob接收后再以自己的私钥进行解密。

以上是关于各大加密算法对比(原理性能安全运用)的主要内容,如果未能解决你的问题,请参考以下文章

SSH原理与运用

京东云开发者|经典同态加密算法Paillier解读 - 原理实现和应用

常见加密算法原理及概念

java之--加密解密算法

加密算法原理及DNS服务原理

区块链教程区块链背后的信息安全2DES3DES加密算法原理一