对称加密及AES加密算法

一、对称加密

1、什么是对称加密?

对称加密就是指,加密和解密使用同一个密钥的加密方式。

2、对称加密的工作过程

发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。

3、对称加密的优点

加密计算量小、速度块,适合对大量数据进行加密的场景。(记住这个特点,实际使用是会用到的)

4、对称加密的两大不足

密钥传输问题:如上所说,由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。(比如,我们客户端肯定不能直接存储对称加密的密钥,因为被反编译之后,密钥就泄露了,数据安全性就得不到保障,所以实际中我们一般都是客户端向服务端请求对称加密的密钥,而且密钥还得用非对称加密加密后再传输。)

密钥管理问题:再者随着密钥数量的增多,密钥的管理问题会逐渐显现出来。比如我们在加密用户的信息时,不可能所有用户都用同一个密钥加密解密吧,这样的话,一旦密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。

二、AES加密算法

1、什么是AES加密算法

上一小节说到了对称加密,那么针对对称加密的话,是有很多的对称加密算法的,如DES加密算法、3DES加密算法等,但是因为AES加密算法的安全性要高于DES和3DES,所以AES已经成为了主要的对称加密算法,因此本篇主要学习一下AES加密算法。

AES加密算法就是众多对称加密算法中的一种,它的英文全称是Advanced Encryption Standard,翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。

AES加密算法采用分组密码体制,每个分组数据的长度为128位16个字节,密钥长度可以是128位16个字节、192位或256位,一共有四种加密模式,我们通常采用需要初始向量IV的CBC模式,初始向量的长度也是128位16个字节。

2、AES的加密流程

(1)五个关键词讲解
要理解AES的加密流程,会涉及到AES加密的五个关键词,分别是:分组密码体制、Padding、密钥、初始向量IV和四种加密模式,下面我们一一介绍。

  • 分组密码体制:所谓分组密码体制就是指将明文切成一段一段的来加密,然后再把一段一段的密文拼起来形成最终密文的加密方式。AES采用分组密码体制,即AES加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用Padding来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文

  • PaddingPadding就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式PKCS5、PKCS7和NOPADDING。PKCS5是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5。PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0。NoPadding是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。那如果在PKCS5模式下,最后一段数据的内容刚好就是16个16怎么办?那解密端就不知道这一段数据到底是有效数据还是填充数据了,因此对于这种情况,PKCS5模式会自动帮我们在最后一段数据后再添加16个字节的数据,而且填充数据也是16个16,这样解密段就能知道谁是有效数据谁是填充数据了。PKCS7最后一段数据的内容是16个0,也是同样的道理。解密端需要使用和加密端同样的Padding模式,才能准确的识别有效数据和填充数据。我们开发通常采用PKCS7 Padding模式

  • 初始向量IV初始向量IV的作用是使加密更加安全可靠,我们使用AES加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量IV的长度规定为128位16个字节,初始向量的来源为随机生成。至于为什么初始向量能使加密更安全可靠,会在下面的加密模式中提到。

  • 密钥:AES要求密钥的长度可以是128位16个字节、192位或者256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量。我们开发通常采用128位16个字节的密钥,我们使用AES加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成。(注意:后面我们在谈到AES的加密原理时,会提到一个初始密钥,那个初始密钥指的就是这里我们提供的这个密钥。)

  • 四种加密模式:AES一共有四种加密模式,分别是ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB,我们一般使用的是CBC模式。四种模式中除了ECB相对不安全之外,其它三种模式的区别并没有那么大,因此这里只会对ECB和CBC模式做一下简单的对比,看看它们在做什么。

  • ECB(电子密码本模式)
    在这里插入图片描述

  • CBC(密码分组链接模式)
    在这里插入图片描述

  • CFB、OFB:略。

(2)AES的加密流程
经过了(1)五个关键词的讲解,我们可以先说一句话:我们通常使用AES加密,会采用128位16个字节的密钥和CBC加密模式。

因此,我们这里要说的加密流程就是针对这种情况的。

  • 首先AES加密会把明文按128位16个字节,切成一段一段的数据,如果数据的最后一段不够16个字节,会用Padding来填充。
  • 然后把明文块0与初始向量IV做异或操作,再用密钥加密,得到密文块0,同时密文块0也会被用作明文块1的加密向量。
  • 然后明文块1与密文块0进行异或操作,再用密钥加密,得到密文块1。(当然这里只是假设数据只有两段,如果数据不止两段,依次类推,就可以得到很多段密文块。)
  • 最后把密文块拼接起来就能得到最终的密文。

3、AES的加密原理

我们探讨AES的加密原理,其实就是探讨上图中加密器里面做了什么。那加密器里面做了什么呢?这里不妨先透漏一下,加密器里其实做了四个重要的操作,分别是:密钥扩展、初始轮、重复轮和最终轮。AES的加密原理其实可以说,就是这四个操作。

  • 密钥扩展:密钥扩展是指根据初始密钥生成后面10轮密钥的操作。(为什么是10轮,后面重复轮会说到)

为什么需要进行密钥扩展
因为AES加密内部其实不只执行一轮加密,而是一共会执行11轮加密,所以AES会通过一个简单快速的混合操作,根据初始密钥依次生成后面10轮的密钥,每一轮的密钥都是依据上一轮生成的,所以每一轮的密钥都是不同的。尽管很多人抱怨说这种方式太简单了,但其实已经足够安全了。

那密钥扩展具体怎么个扩展法呢?

首先我们要知道除了初始密钥以外,后面每一轮的密钥都是由上一轮的密钥扩展而来的,密钥扩展有四个步骤:排列、置换、与轮常量异或、生成下一轮密钥的其他列。排列是指对数据重新进行安排,置换是指把数据映射为其它的数据,轮常量异或是指…,生成下一轮密钥的其他列是指…。

比方说我们现在要扩展出第二轮的密钥:

第一步排列:我们会拿出初始密钥的最后一列(密钥为16个字节,请自行将字节和格子对应起来看),然后把这一列的第一个字节放到最后一个字节的位置上去,其它字节依次向上移动一位,我们称经过排列后这一列为排列列

第二步置换:然后把排列列经过一个置换盒(即S盒),排列列就会被映射为一个崭新的列,我们称这个崭新的列为置换列

第三步与轮常量异或:然后我们会把置换列和一个叫轮常量的东西相异或,这样初始密钥的最后一列经过三个步骤,就成为了一个崭新的列,这一列将用来作为第二轮密钥的最后一列。

第四步生成二轮密钥的其他列:很简单,刚才不是已经得到二轮密钥的最后一列了嘛,然后用二轮密钥的最后一列和初始密钥的第一列异或就得到二轮密钥的第一列,用二轮密钥的第一列和初始密钥的第二列异或就得到二轮密钥的第二列,用二轮密钥的第二列和初始密钥第三列异或就得到二轮密钥的第三列,这样二轮密钥的四列就集齐了,我们就可以得到一个完整的128位16字节的二轮密钥。(256位密钥要比这个复杂的多)

这样一轮密钥就算扩展完了,依照这样的方法,我们就可以由二轮密钥扩展出三轮密钥,由三轮密钥扩展出四轮密钥,以此类推,直至扩展出后面需要的10轮密钥

4、实际开发中使用AES加密需要注意的地方

  • 服务端和我们客户端必须使用一样的密钥和初始向量IV
  • 服务端和我们客户端必须使用一样的加密模式
  • 服务端和我们客户端必须使用一样的Padding模式
    以上三条有一个不满足,双方就无法完成互相加解密。

同时针对对称加密密钥传输问题这个不足:我们一般采用RSA+AES加密相结合的方式,用AES加密数据,而用RSA加密AES的密钥。同时密钥和IV可以随机生成,这要是128位16个字节就行,但是必须由服务端来生成,因为如果由我们客户端生成的话,就好比我们客户端存放了非对称加密的私钥一样,这样容易被反编译,不安全,一定要从服务端请求密钥和初始向量IV。

原文链接:https://www.jianshu.com/p/3840b344b27c

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值