百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

加密算法之AES(aes加密算法实现)

toyiye 2024-08-10 21:25 7 浏览 0 评论

接着Base64编码讲,既然Base64不能用来加密,那么,有哪些可用的加密算法呢?

按照加密和解密的密钥是否相同,可分为对称加密,非对称加密,散列算法等。

对称加密:又称为 共享密钥加密算法。在 对称加密算法 中,使用的密钥只有一个,发送接收 双方都使用这个密钥对数据进行 加密解密。这就要求加密和解密方事先都必须知道加密的密钥。

  1. 数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
  2. 数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。

常用的对称加密有DES,3DES,AES等

非对称加密:

非对称加密算法,又称为 公开密钥加密算法。它需要两个密钥,一个称为 公开密钥 (public key),即 公钥,另一个称为 私有密钥 (private key),即 私钥

因为 加密解密 使用的是两个不同的密钥,所以这种算法称为 非对称加密算法

  • 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密
  • 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密
  • 常用的非对称加密算法有RSA,DSA等

    散列算法:

    一般指SHA家族,英文为Secure Hash Algorithm,中文指安全散列算法,能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。除了SHA之外,像MD5,hash散列算法也是其中的代表。SHA家族如下表

    散列算法一般是不可逆的,主要用作信息一致性和完整性的校验。

    ok,,进入今天的正题AES,由上文我们知道AES是一个对称加密算法,接下来我们了解一下其算法原理。

    AES相关概念

    在讲AES之前,我们先聊一聊DES算法,为什么?且听我娓娓道来

    DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。

    DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。

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

    无论DES怎么加密,只要计算器的性能足够高,那么也可以在短时间内破解掉密钥编码,那么安全性也并非牢不可破,同时其加密的效率也不是很理想。关于DES的加密原理,有兴趣的同学可以去看维基百科。

    AES作为DES的取代者在安全性,效率,灵活性上都有不少提升。

    在了解AES之前,我们先搞清楚什么是密钥,填充和模式

    1.密钥

    密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

    AES支持三种长度的密钥:128位,192位,256位,平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用

    从效率上看AES128最高,AES256的安全性最高,本质在于他们加密的轮数不同而已。

    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}

    需要注意的是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.无法并行计算,性能上不如ECB
    2.引入初始化向量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的范围出现乱码现象方便日志或者控制台查看。

    相关推荐

    为何越来越多的编程语言使用JSON(为什么编程)

    JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

    何时在数据库中使用 JSON(数据库用json格式存储)

    在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

    MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

    前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

    JSON对象花样进阶(json格式对象)

    一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

    深入理解 JSON 和 Form-data(json和formdata提交区别)

    在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

    JSON 语法(json 语法 priority)

    JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

    JSON语法详解(json的语法规则)

    JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

    MySQL JSON数据类型操作(mysql的json)

    概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

    JSON的数据模式(json数据格式示例)

    像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

    前端学习——JSON格式详解(后端json格式)

    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

    什么是 JSON:详解 JSON 及其优势(什么叫json)

    现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

    PostgreSQL JSON 类型:处理结构化数据

    PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

    JavaScript:JSON、三种包装类(javascript 包)

    JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

    Python数据分析 只要1分钟 教你玩转JSON 全程干货

    Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

    比较一下JSON与XML两种数据格式?(json和xml哪个好)

    JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

    取消回复欢迎 发表评论:

    请填写验证码