首页 > 编程知识 正文

aes rsa(aes加密算法安全吗)

时间:2023-05-06 18:15:51 阅读:81907 作者:18

根据Base64代码,Base64不能用于加密,那么可以使用什么样的加密算法呢?

根据加密和解密的密钥是否相同,可以分为对称加密、非对称加密、散列算法等。

对称加密:也称为共享密钥加密算法。 对称加密算法只使用一个密钥,发送和接收都使用该密钥加密和解密数据。 因此,加密和解密双方需要事先知道加密的密钥。

数据加密过程:在对称加密算法中,数据传输方将明文(原始数据)和密钥一起进行特殊的加密处理,生成复杂的密文进行发送。 数据解密过程:数据接收方收到密文后,如果想要读取原始数据,必须使用与加密所用密钥相同算法的逆算法对密文进行解密,以便将加密的密文恢复为可读明文。 常用的对称加密有DES、3DES、AES等

不对称加密:

非对称加密算法也称为公钥加密算法。 需要两个密钥:公钥(公共密钥)和私钥(私有密钥)。

由于加密和解密使用两个不同的密钥,因此该算法称为非对称加密算法。

使用公钥加密数据时,只能使用对应的私钥进行解密。 使用私钥加密数据时,只能使用对应的公钥进行解密。 一般的非对称加密算法有RSA、DSA等

散列算法:

一般是指SHA家族,英语是指安全散列算法,中文是指安全散列算法,可以计算与一个数字消息对应的长度固定的字符串(也称为消息摘要) 另外,如果输入的消息不同,则对应不同字符串的可能性会变高。 除了SHA以外,如MD5一样,hash散列算法也是其代表。 SHA家族如下表所示

哈希算法一般是不可逆的,主要用于信息完整性和完整性的检查。

ok,进入今天的正题——AES。 我已经知道AES是对称加密算法,接下来让我们来了解一下该算法的原理。

在谈论

AES相关概念

AES之前,让我们先来谈谈DES算法。 为什么? 米勒听我生动地说

DES加密算法是分组加密,以64位为分组对数据进行加密。 密钥长度为56位,加密解密使用相同的算法。

DES加密算法是对密钥保密的,是包含加密和解密算法的公开算法。 这样,只有与发送方拥有相同密钥的人才能破译用DES加密算法加密的密文数据。 因此,解密DES加密算法实际上是搜索密钥的编码。 如果用穷举法检索56位长的密钥,其运算次数为2 ^ 56次。

3DES是基于DES的对称算法,用3个不同的密钥对1个数据进行3次加密,强度更高

不管DES怎么加密,只要计算机性能足够,就可以在短时间内解密密钥代码,安全性也不牢固,加密效率也不太好。 关于DES的加密原理,有兴趣的同学可以去看维基百科。

AES作为DES的替代者,在安全性、效率性、灵活性上有不少提高。

在理解AES之前,要弄清楚什么是密钥、填充和模式。

1 .键

密钥是AES算法实现加密和解密的基本。 对称加密算法之所以是对称的,是因为必须使用相同的密钥来加密和解密明文。

AES支持三种长度的密钥: 128位、192位和256位。 虽然通常称为AES128、AES192、AES256,但实际上是指对不同长度的密钥使用AES算法

从效率上看,AES128最高,AES256安全性最高,本质上只是他们加密的回合数不同。

2 .填充

要理解填充的概念,必须首先理解AES的分组加密特性。 什么是组加密? 请看下图:

AES算法在加密明文时,不是用一个大脑对整个明文进行加密,而是将明文分割为一个个独立的明文块,各明文块的长度为128bit,因此也有人将对称加密称为块加密。

这些明文块经过AES编码器的复杂处理,生成一个个独立的密文块,这些密文块被连接在一起,是最终的AES加密的结果。

但这里有个问题:

如果某个明文的长度为192比特,那么如果每128比特分割为一个明文块,则第二个明文块只有64比特,不足128比特。 这个时候怎么办? 需要填充明文块。

填充类别:

无填充:

虽然不输入任何内容,但明文必须是16字节的整数倍。

pkcs 5填充(默认) :

如果明文块小于16字节(128比特),则在明文块的末尾补充适当数量的单词

符,且每个字节的值等于缺少的字符数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:

如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

需要注意的是AES在加密和解密使用的填充方式必须相同。

3.模式

AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:

ECB模式(默认):

电码本模式 Electronic Codebook Book

CBC模式:

密码分组链接模式 Cipher Block Chaining

CTR模式:

计算器模式 Counter

CFB模式:

密码反馈模式 Cipher FeedBack

OFB模式:

输出反馈模式 Output FeedBack

同样加密和机密采用的模式也必须相同。

AES加密原理

在这里我们重新梳理一下:

1.把明文按照128bit拆分成若干个明文块。2.按照选择的填充方式来填充最后一个明文块。3.每一个明文块利用AES加密器和密钥,加密成密文块。4.拼接所有的密文块,成为最终的密文结果。

那么,到底AES加密器怎么对单个明文快加密的呢?对于我么来讲,依然是个禁区。那么,我们今天就解开它的神秘面纱,烧脑时刻:

每个明文块都需要多次加密,那么要分多少轮合适呢?

初始轮(Initial Round) 1次

普通轮(Rounds) N次

最终轮(Final Round) 1次

AES的Key支持三种长度:AES128,AES192,AES256。Key的长度决定了AES加密的轮数。

除去初始轮,各种Key长度对应的轮数如下:AES128:10轮AES192:12轮AES256:14轮

不同阶段的Round有不同的处理步骤。

初始轮只有一个步骤:加轮密钥(AddRoundKey)

普通轮有四个步骤:字节代替(SubBytes)行移位(ShiftRows)列混淆(MixColumns)加轮密钥(AddRoundKey)

最终轮有三个步骤:字节代替(SubBytes)行移位(ShiftRows)加轮密钥(AddRoundKey)

看下面图示:

字节替代

首先需要说明的是,16字节的明文块在每一个处理步骤中都被排列成4X4的二维数组。

所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。替代的依据是什么呢?依据一个被称为S盒(Subtitution Box)的16X16大小的二维常量数组。

假设明文块当中a[2,2] = 5B(一个字节是两位16进制),那么输出值b[2,2] = S[5][11]。

行移位(ShiftRows)

这一步很简单,就像图中所描述的:第一行不变第二行循环左移1个字节第三行循环左移2个字节第四行循环左移3个字节

列混淆(MixColumns)

这一步,输入数组的每一列要和一个名为修补矩阵(fixed matrix)的二维常量数组做矩阵相乘,得到对应的输出列。

加轮密钥(AddRoundKey)

这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵。

让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]。

需要补充一点,加密的每一轮所用到的密钥并不是相同的。这里涉及到一个概念:扩展密钥(KeyExpansions)。

扩展密钥(KeyExpansions)

AES源代码中用长度 4* 4 *(10+1) 字节的数组W来存储所有轮的密钥。W{0-15}的值等同于原始密钥的值,用于为初始轮做处理。

后续每一个元素W[i]都是由W[i-4]和W[i-1]计算而来,直到数组W的所有元素都赋值完成。

W数组当中,W{0-15}用于初始轮的处理,W{16-31}用于第1轮的处理,W{32-47}用于第2轮的处理 ......一直到W{160-175}用于最终轮(第10轮)的处理。

而解密即加密的逆过程,最终轮->普通轮->初始轮,扩展密匙也相反。

AES的模式在加解密中的运用

前文知道AES有5中模式,那么他们是怎么工作的?

由于篇幅原因,我们先挑两种模式说一下,ECB,CBC模式

1.ECB,即电码本模式,是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的

优点:简单,可并行计算,提高加密效率。缺点:相同的明文块经过加密会变成相同的密文块,因此安全性较差

2.CBC模式

CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。

IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。

这样以来,相同的明文块加密出的密文块显然是不一样的。

CBC模式的好处是什么呢?安全性更高

坏处也很明显:1.无法并行计算,性能上不如ECB2.引入初始化向量IV,增加复杂度

至于其他的模式,本文不再过多讲解,有兴趣的可以借助互联网或者书本深入了解。

开源工具

在java的javax.crypto包有很好用的封装哦,不需要额外的jar包支持。

java 代码示例:

加密步骤:

* 1.构造密钥生成器 * 2.根据ecnodeRules规则初始化密钥生成器 * 3.产生密钥 * 4.创建和初始化密码器 * 5.内容加密 * 6.返回字符串

代码示例:

kgen.init传入的第一个参数128决定了密钥的长度是128bit。除此之外你还可以使用Cipher.getInstance("AES/CBC/NoPadding")指定AES的填充方式和工作模式。

几点补充:

1.我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。

2.填充明文时,如果明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会填充一组额外的16字节明文块。

解密:

1.同加密1-4步 * 2.将加密后的字符串反纺成byte[]数组 * 3.将加密内容解密

代码示例:

注意:上述代码使用Base64进行了编码和解码,避免个别字符超出ASCII的范围出现乱码现象方便日志或者控制台查看。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。