奇妙的安全旅行之AES算法

hi,大家好,今天开始我们来介绍一下对称加密算法中的AES算法。

AES简介

AES(英语:Advanced Encryption Standard,缩写:AES),即高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,AES算法已然成为对称密钥加密中最流行的算法之一。严格来说 AES 是一种通用的加密标准,通常我们常说的 AES 算法是指 AES 标准的实现算法:Rijndael 算法。

Rijndael 算法

NIST 在 1997 年 09 月 12 日公开征集更高效更安全的替代 DES 加密算法,第一轮共有 15 种算法入选,其中 5 种算法入围了决赛,分别是 Rijndael、Serpent、Twofish、RC6 和 MARS。经过 3 年的验证、评测及公众讨论之后 Rijndael 算法最终入选。

Rijndael 算法是一个分组密码算法族,其分组长度包括 128 比特、160 比特、192 比特、224 比特、256 比特,密钥长度也包括这五种长度。 AES 标准算法是选取了分组长度为 128 比特,密钥长度为 128 比特、192 比特和 256 比特的三个版本,名称分别为 AES-128、AES-196 和 AES-256,这三个版本加密思路基本一样,只是密钥扩展算法的过程会稍有不同。

AES的基本结构

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完所有组。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。如下表所示:

算法密钥长度(bit)分组长度(bit)加密轮数
AES-12812812810
AES-19219212812
AES-25625612814

AES算法原理

AES算法主要有四种操作处理,分别是

  • 密钥加法层 (也叫轮密钥加,英文Add Round Key)
  • 字节代换层 (SubByte)
  • 行位移层 (Shift Rows)
  • 列混淆层(Mix Column)

AES算法的明文和密钥都是由16个字节组成的数据(当然密钥还支持192位和256位的长度,这里暂不讨论),它是按照字节的先后顺序从上到下、从左到右进行排列的。而加密出的密文读取顺序也是按照这个顺序读取的,相当于将数组还原成字符串的模样了,然后再解密的时候又是按照4x4数组处理的。AES算法在处理的轮数上只有最后一轮操作与前面的轮处理上有些许不同(最后一轮只是少了列混淆处理),在轮处理开始前还单独进行了一次轮密钥加的处理。在处理轮数上,我们只考虑128位密钥的10轮处理。接下来,就开始一步步的介绍AES算法的处理流程了。

AES算法流程图:

密钥加法层 (Add Round Key)

在密钥加法层中有两个输入的参数,分别是明文和子密钥k[0],而且这两个输入都是128位的。k[0]实际上就等同于密钥k,具体原因在密钥扩展生成中进行介绍。我们前面在介绍扩展域加减法中提到过,在扩展域中加减法操作和异或运算等价,所以这里的处理也就异常的简单了,只需要将两个输入的数据进行按字节异或操作就会得到运算的结果。图示:

字节代换层 (SubByte)

字节代换层的主要功能就是让输入的数据通过S_box表完成从一个字节到另一个字节的映射,这里的S_box表是通过某种方法计算出来的,具体的计算方法在此不做详述,我们主需要知道如何使用S_box结果即可。S_box表是一个拥有256个字节元素的数组,可以将其定义为一维数组,也可以将其定义为16·16的二维数组,如果将其定义为二维数组,读取S_box数据的方法就是要将输入数据的每个字节的高四位作为第一个下标,第四位作为第二个下标,略有点麻烦。这里建议将其视作一维数组即可。逆S盒与S盒对应,用于解密时对数据处理,我们对解密时的程序处理称作逆字节代换,只是使用的代换表盒加密时不同而已。

S盒

逆S盒

加密图示

行位移 (Shift Rows)

行位移操作最为简单,它是用来将输入数据作为一个4·4的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。ShiftRows子层属于AES手动的扩散层,目的是将单个位上的变换扩散到影响整个状态当,从而达到雪崩效应。在加密时行位移处理与解密时的处理相反,我们这里将解密时的处理称作逆行位移。它之所以称作行位移,是因为它只在4·4矩阵的行间进行操作,每行4字节的数据。

**加密时:**保持矩阵的第一行不变,第二行向左移动8Bit(一个字节)、第三行向左移动2个字节、第四行向左移动3个字节。

**解密时:**保持矩阵的第一行不变,第二行向右移动8Bit(一个字节)、第三行向右移动2个字节、第四行向右移动3个字节。

正向行位移图解:

逆向行位移图解:

列混淆(MixColumn)

列混淆子层是AES算法中最为复杂的部分,属于扩散层,列混淆操作是AES算法中主要的扩散元素,它混淆了输入矩阵的每一列,使输入的每个字节都会影响到4个输出字节。行位移子层和列混淆子层的组合使得经过三轮处理以后,矩阵的每个字节都依赖于16个明文字节成可能。其中包含了矩阵乘法、伽罗瓦域内加法和乘法的相关知识。

AES 算法实现

随机生成AES 密钥:

/*** 生成随机AES密钥,密钥长度128位** @return AES明文密钥Base64字符串*/
public static String genAesRandomKey2Base64Str() {return Base64.encodeBase64String(genAesRandomKey());
}/*** 生成随机AES密钥,密钥长度128位** @return AES明文密钥字节数组*/
public static byte[] genAesRandomKey() {KeyGenerator keygen = null;try {keygen = KeyGenerator.getInstance(AES_ALGORITHM);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("genarateRandomKey fail!", e);}SecureRandom random = new SecureRandom();keygen.init(random);Key key = keygen.generateKey();return key.getEncoded();
}

AES 加密:

/*** AES 加密** @param data 待加密密内容* @param key  加密密钥* @return*/
public static byte[] encrypt(byte[] data, byte[] key) {if (key.length != 16) {throw new RuntimeException("Invalid AES key length (must be 16 bytes)");}try {SecretKeySpec secretKey = new SecretKeySpec(key, AES_ALGORITHM);// 创建密码器Cipher cipher = Cipher.getInstance(AES_CIPTHER);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] result = cipher.doFinal(data);return result;} catch (Exception e) {throw new RuntimeException("encrypt fail!", e);}
}

AES 解密:

/*** AES 解密** @param data 待解密内容* @param key  解密密钥* @return*/
public static byte[] decrypt(byte[] data, byte[] key) {if (key.length != 16) {throw new RuntimeException("Invalid AES key length (must be 16 bytes)");}try {SecretKeySpec secretKey = new SecretKeySpec(key, AES_ALGORITHM);// 创建密码器Cipher cipher = Cipher.getInstance(AES_CIPTHER);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] result = cipher.doFinal(data);return result;} catch (Exception e) {throw new RuntimeException("decrypt fail!", e);}
}

查看完整代码请访问:

https://github.com/ForTheDevelopers/JavaSecurity

应用场景

由于AES算法效率较高,一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行加密通信时,既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用AES算法。

另外在实际应用中通常AES和RSA算法结合使用,一方面确保了密钥的安全性,另一方面又保证了加密的效率。后面我们会专门详细介绍这一部分的内容。

总结

AES算法由于其安全性高,加密速度快,可以处理大量加密数据等特性而被广泛使用,AES由于也属于对称加密算法,所以也涉及分组及填充模式的选择,大家可以参考上一篇文章。另外也欢迎大家关注我们的公众号,回复【加解密】获取本系列的全部源码。

参考

1,AES算法详解

全性高,加密速度快,可以处理大量加密数据等特性而被广泛使用,AES由于也属于对称加密算法,所以也涉及分组及填充模式的选择,大家可以参考上一篇文章。另外也欢迎大家关注我们的公众号,回复【加解密】获取本系列的全部源码。

参考

1,AES算法详解

创作不易,如果大家喜欢本文,欢迎点赞,转发,你的关注是我们继续前进的动力_

关于作者
  • GitHub:https://github.com/ForTheDevelopers

  • 掘金:https://juejin.cn/user/1204720472953022/posts

  • CSDN:https://blog.csdn.net/ForTheDevelopers

  • segmentfault:https://segmentfault.com/u/for_the_developers

联系作者
  • 微信号:ForTheDeveloper

  • 公众号:ForTheDevelopers

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios vue 回调函数_前端Vue 面试题大全

点蓝色字关注“程序员报刊” 「学习 新闻 招聘 」vue的底层原理?vue组件之间的通信?JS中判断数据类型的方法有几种?最常见的判断方法:typeof判断已知对象类型的方法:instanceof根据对象的constructor判断:constructor无敌万能的…

奇妙的安全旅行之RSA算法

hi,大家好,我是开发者FTD。今天我们开始介绍非对称加密算法。非对称加密算法区别于对称加密算法的主要特点是,非对称加密算法有两个密钥:公钥 (public key) 和私钥 (private key)。公钥和私钥是一对密钥,如果用公钥对数…

易语言多级指针读取_C语言指针难吗?纸老虎而已,纯干货讲解(附代码)

作者:21IC网络整理,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面…

奇妙的安全旅行之DSA算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法中的DSA算法。 DSA 算法简介 DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard) 数字签…

lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描

【R语言】如何将照片快速转换为素描(三行代码给老婆(划掉)画一张素描)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com最近发现了一个比较好玩的包,叫做sketcher这个包的作用就是将图片转化成素描的样式以下是…

2021年程序员1月薪资统计,你在哪一档?

hi,大家好,我是开发者FTD。2021年1月份马上就要结束了,再过一周多春节也即将来临,春节后估计又是一波跳槽高峰,那我们一起来看一下当前程序员的薪资状况,让大家对于年后是否要换工作也有个心理预期吧。 注&…

海康sip服务器地址_完整SIP/SDP媒体协商概论SDP基础使用要求

接完整SIP/SDP媒体协商概论-SDP基础-核心定义全解。上一个章节笔者介绍了关于SDP的一些核心概念(第一章节和第二章节),今天,我们继续在此之间讨论SDP的其余基础内容(从第三章节开始)。在以下讨论中,笔者会介绍关于SDP的使用,SDP的…

一月:你今年还回家过年吗?

hi,大家好,我是开发者FTD。一月份对于我来说,是工作和生活渐渐明朗的一个月,之前迷茫的状态感觉在这一个月开始慢慢消失,并让整个人的精神状态开始转变。2021年才刚刚开始,大家也可以对自己新的一年进行一个…

6个座位办公室最佳位置_2021最佳动力艇大奖:6个类别29个入围名单揭晓

年度最佳动力艇大奖由英国杂志《Motor Boat & Yachting》(MBY)主办,经(MBY)深思熟虑,评委们缩小了2021年度最佳动力艇大奖的决赛入围名单。由于旅行限制,今年的形式会有所不同,不能像往年一样测试那么多的船。因此&#xff0c…

奇妙的安全旅行之ECC算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法的ECC算法。 ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由 Koblitz 和 Mi…

奇妙的安全旅行之国密算法

hi,大家好,我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法? 密码算法是保障信息安全的核心技术,尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具,可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文:渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET,选择创建攻击载荷和监听器: 2…

wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测

前言每个NAS系统都应该配备足够容量的硬盘,以满足数据存储需求。WD Red 西数红盘存储空间高达14TB,可以为需要构建大容量和高性能NAS存储方案的用户提供解决方案。WD Red西数红盘14T运行安静且热量低,其采用的NASware 3.0技术提高了兼容性、集…

奇妙的安全旅行之加密算法(完整版)

hi,大家好,我是开发者FTD。之前我在公众号写了一个工作中常用加密算法系列的文章终于肝完了,为了方便小伙伴们查看和收藏,我将这个系列汇集整理成了一个PDF文档,有需要的小伙伴可以关注公众号,在公众号后台…

智能车s3010舵机工作电压_全国大学生智能车竞赛决战南京信息工程大学

未来网高校频道8月25日讯(记者 杨子健 通讯员 唐翠梅 方向 张峰 曾雅俊)8月24日上午,由中国自动化学会主办,南京信息工程大学承办的第十五届全国大学生智能汽车竞赛创意组总决赛、第十五届全国大学生智能汽车竞赛华东赛场预决赛开幕仪式在学校东苑体育馆…

直接拿来用!GitHub10个开源免费的后台管理面板

hi,大家好,我是开发者FTD。今天要给大家介绍几个GitHub上开源免费好用的后台管理面板,大家在平时工作中,一定不可避免的会开发一些业务管理控制后台,如果从零开始完整的做一套不是一件很容易的事情,还好Git…

人名和成绩一起排序_EXCEL基础知识——排序功能的使用

排序筛选可能是大家工作中最常用的数据处理方式了,它能很快地从大到小完成排序,并且筛选除你想要的数据。从简单的排序筛选到高级筛选你会哪几步呢?一起来看看。一、简单排序下面这组数据,我们想要将数学成绩从大到小的排序&#…

android骰子游戏代码_真神器!不用手写一行代码就能做网站~

点击上方“Python编程时光”,选择“加为星标”第一时间关注Python技术干货!制作网站用什么,Dreamweaver 还是 Fireworks?现在,用 GPT-3 就可以。一位来自旧金山的程序员小哥做了款名为 debuild.co 的网页制作软件&…

一文带你读懂计算机进制

hi,大家好,我是开发者FTD。在我们的学习和工作中少不了与进制打交道,从出生开始上学,最早接触的就是十进制,当大家学习和使用计算机时候,我们又接触到了二进制、八进制以及十六进制。那么大家对进制的认识和…

切换分支 如何判断 是否完成_如何判断展览公司是否专业?

可以看出,展会装修目前市场上的展览设计公司数量非常庞大,许多公司目前正在从事这方面的业务。对于每个人来说,展览设计公司之后有很多好处,所以当你继续选择时,选择面会变得更加广泛。无论人们如何选择展览设计公司&a…