赞
踩
随着互联网的发展,越来越多的隐私数据需要载网络中传输,为了保证数据的安全,我们将会对数据进行加密,今天我就介绍一种经典的数据算法AES(Advanced Encryption Standard)。
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
AddRoundKey:矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
SubBytes:通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
ShiftRows:将矩阵中的每个横列进行循环式移位。
MixColumns:为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。
最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。
1.加密操作,在java中可用以下方式实现
- /**
- * @author xy丶
- * @date 2021/11/10
- */
- public class AESUtil {
- /**
- * 加密算法AES
- */
- private static final String KEY_ALGORITHM = "AES";
-
- /**
- * key的长度,Wrong key size: must be equal to 128, 192 or 256
- * 传入时需要16、24、36
- */
- private static final Integer KEY_LENGTH = 16 * 8;
-
- /**
- * 算法名称/加密模式/数据填充方式
- * 默认:AES/ECB/PKCS5Padding
- */
- private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
-
-
- /**
- * 加密
- *
- * @param content 加密的字符串
- * @param encryptKey key值
- */
- public static String encrypt(String content, String encryptKey) throws Exception {
- //设置Cipher对象
- cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));
-
- //调用doFinal
- byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
-
- // 转base64
- return Base64.encodeBase64String(b);
-
- }
-
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
2.解密操作,在java中可用以下方式实现
- /**
- * @author xy丶
- * @date 2021/11/10
- */
- public class AESUtil {
- /**
- * 加密算法AES
- */
- private static final String KEY_ALGORITHM = "AES";
-
- /**
- * key的长度,Wrong key size: must be equal to 128, 192 or 256
- * 传入时需要16、24、36
- */
- private static final Integer KEY_LENGTH = 16 * 8;
-
- /**
- * 算法名称/加密模式/数据填充方式
- * 默认:AES/ECB/PKCS5Padding
- */
- private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
-
-
- /**
- * 解密
- *
- * @param encryptStr 解密的字符串
- * @param decryptKey 解密的key值
- */
- public static String decrypt(String encryptStr, String decryptKey) throws Exception {
- //base64格式的key字符串转byte
- byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
- cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));
- //调用doFinal解密
- byte[] decryptBytes = cipher.doFinal(decodeBase64);
- return new String(decryptBytes);
- }
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
常用的加密模式有ECB、CBC。ECB,即electronic code book,将整个明文分成若干段相同小段,然后每小段进行加密,每段互不依赖,可以并行处理,同样的明文就会生成同样的密文;CBC,即cipher block chaining,密文分组链模式,密文分组间如同链条相互连接,先将明文切割为若干段,每一小段与上一段的密文段运算后(第一个块没有上个密文段,故而使用IV进行运算),再同秘钥进行加密,因为是串行处理,所以同样明文每次生成的密文不一样。
AES的块大小为16个字节的整数倍,明文分块时,如果块大小不够,则需要使用固定数据进行填充。AES的Cipher.getInstance调用时,使用AES即可,默认使用的分组模式就是ECB,填充模式为PKCS5Padding。如果需要使用CBC模式,则需要加入额外的Iv参数。
结尾。喜欢的朋友就点个赞加个收藏吧谢谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。