AES算法简介

首先推荐一下 这个 40多万点击量的 AES算法介绍;

https://blog.csdn.net/qq_28205153/article/details/55798628

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
在这里插入图片描述

具体工作的步骤如下:
1.发送方利用密钥123456,加密明文“我是小灰”,加密结果为TNYRvx+SNjZwEK+ZXFEcDw==。
2.发送方把加密后的内容TNYRvx+SNjZwEK+ZXFEcDw传输给接收方。
3.接收方收到密文TNYRvx+SNjZwEK+ZXFEcDw
,利用密钥123456还原为明文“我是小灰”。

摘要算法是不可逆的,他主要是对信息一致性和完整性的校验;
对称算法是可逆的,他主要保护私密信息不被泄露;

1.密钥
密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES支持三种长度的密钥:
128位,192位,256位
平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。
这三种256位的最安全,128的性能最优;

2.填充
要想了解填充的概念,我们先要了解AES的分组加密特性。
什么是分组加密呢?我们来看看下面这张图:
在这里插入图片描述
AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。
这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
但是这里涉及到一个问题:
假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

NoPadding: 不做任何填充,但是要求明文必须是16字节的整数倍。 PKCS5Padding(默认):
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
比如明文:{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}

3.模式
AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:
ECB、CBC、CTR、CFB、OFB
模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。
ECB模式(默认):
电码本模式 Electronic Codebook Book
CBC模式:
密码分组链接模式 Cipher Block Chaining
CTR模式:
计算器模式 Counter
CFB模式:
密码反馈模式 Cipher FeedBack
OFB模式:
输出反馈模式 Output FeedBack

在这里插入图片描述
在这里我们重新梳理一下:
1.把明文按照128bit拆分成若干个明文块。
2.按照选择的填充方式来填充最后一个明文块。
3.每一个明文块利用AES加密器和密钥,加密成密文块。
4.拼接所有的密文块,成为最终的密文结果。

在这里插入图片描述
具体分成多少轮呢?
初始轮(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)

1.ECB模式
ECB模式(Electronic Codebook Book)是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的。
在这里插入图片描述
这样的好处是什么呢?
1.简单
2.有利于并行计算
缺点同样也很明显:
相同的明文块经过加密会变成相同的密文块,因此安全性较差。
2.CBC模式
CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。
IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

在这里插入图片描述
从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。
这样以来,相同的明文块加密出的密文块显然是不一样的。
CBC模式的好处是什么呢?
安全性更高
坏处也很明显:
1.无法并行计算,性能上不如ECB
2.引入初始化向量IV,增加复杂度。

在optee中的应用

分配一个进行密码操作的操作句柄,并设定算法类型和模式

TEE_Result TEE_AllocateOperation(TEE_OperationHandle *operation,
     uint32_t algorithm, uint32_t mode,
     uint32_t maxKeySize)

分配一个未初始化的临时object空间

TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
           uint32_t maxKeySize,
           TEE_ObjectHandle *object)

使用buf中的数据初始化某个属性变量

void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,
     const void *buffer, uint32_t length)

将属性变量赋值到object中去

TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object,
           const TEE_Attribute *attrs,
           uint32_t attrCount)

将存放密钥的object中的相关内容保存到操作句柄中

TEE_Result TEE_SetOperationKey(TEE_OperationHandle operation,
          TEE_ObjectHandle key)

使用初始化向量初始化对称加密操作

void TEE_CipherInit(TEE_OperationHandle operation, const void *IV,
      uint32_t IVLen)

完成加解密操作

TEE_Result TEE_CipherDoFinal(TEE_OperationHandle operation,
        const void *srcData, uint32_t srcLen,
        void *destData, uint32_t *destLen)

猜你喜欢

转载自blog.csdn.net/u013921164/article/details/112556285