当前位置:   article > 正文

【AES】加密算法详解_头歌密码学aes加密

头歌密码学aes加密

一.前言

        随着互联网的发展,越来越多的隐私数据需要载网络中传输,为了保证数据的安全,我们将会对数据进行加密,今天我就介绍一种经典的数据算法AES(Advanced Encryption Standard)。

二.AES的简介

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

三.AES的密码说明

 严格地说,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中可用以下方式实现

  1. /**
  2. * @author xy丶
  3. * @date 2021/11/10
  4. */
  5. public class AESUtil {
  6. /**
  7. * 加密算法AES
  8. */
  9. private static final String KEY_ALGORITHM = "AES";
  10. /**
  11. * key的长度,Wrong key size: must be equal to 128, 192 or 256
  12. * 传入时需要16、24、36
  13. */
  14. private static final Integer KEY_LENGTH = 16 * 8;
  15. /**
  16. * 算法名称/加密模式/数据填充方式
  17. * 默认:AES/ECB/PKCS5Padding
  18. */
  19. private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
  20. /**
  21. * 加密
  22. *
  23. * @param content 加密的字符串
  24. * @param encryptKey key值
  25. */
  26. public static String encrypt(String content, String encryptKey) throws Exception {
  27. //设置Cipher对象
  28. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));
  29. //调用doFinal
  30. byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
  31. // 转base64
  32. return Base64.encodeBase64String(b);
  33. }
  34. }

  2.解密操作,在java中可用以下方式实现

  1. /**
  2. * @author xy丶
  3. * @date 2021/11/10
  4. */
  5. public class AESUtil {
  6. /**
  7. * 加密算法AES
  8. */
  9. private static final String KEY_ALGORITHM = "AES";
  10. /**
  11. * key的长度,Wrong key size: must be equal to 128, 192 or 256
  12. * 传入时需要16、24、36
  13. */
  14. private static final Integer KEY_LENGTH = 16 * 8;
  15. /**
  16. * 算法名称/加密模式/数据填充方式
  17. * 默认:AES/ECB/PKCS5Padding
  18. */
  19. private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
  20. /**
  21. * 解密
  22. *
  23. * @param encryptStr 解密的字符串
  24. * @param decryptKey 解密的key值
  25. */
  26. public static String decrypt(String encryptStr, String decryptKey) throws Exception {
  27. //base64格式的key字符串转byte
  28. byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
  29. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));
  30. //调用doFinal解密
  31. byte[] decryptBytes = cipher.doFinal(decodeBase64);
  32. return new String(decryptBytes);
  33. }
  34. }

五.加密模式

        常用的加密模式有ECB、CBC。ECB,即electronic code book,将整个明文分成若干段相同小段,然后每小段进行加密,每段互不依赖,可以并行处理,同样的明文就会生成同样的密文;CBC,即cipher block chaining,密文分组链模式,密文分组间如同链条相互连接,先将明文切割为若干段,每一小段与上一段的密文段运算后(第一个块没有上个密文段,故而使用IV进行运算),再同秘钥进行加密,因为是串行处理,所以同样明文每次生成的密文不一样。

AES的块大小为16个字节的整数倍,明文分块时,如果块大小不够,则需要使用固定数据进行填充。AES的Cipher.getInstance调用时,使用AES即可,默认使用的分组模式就是ECB,填充模式为PKCS5Padding。如果需要使用CBC模式,则需要加入额外的Iv参数。

 

结尾。喜欢的朋友就点个赞加个收藏吧谢谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/800341
推荐阅读
相关标签
  

闽ICP备14008679号