当前位置:   article > 正文

aes加密/解密,cbc模式PKCS#5 padding填充方式_pkcs5padding

pkcs5padding

AES(高级加密标准)是一种广泛使用的对称密钥加密算法。

一、AES加密模式

    1. ECB(电子密码本)模式

ECB是最简单的AES加密模式之一。它使用相同的密钥对数据进行多次加密,每次加密都是对整个数据块进行的。由于每次加密都使用相同的密钥,因此对于单个数据块而言,ECB模式是一种非常安全的加密方式。然而,当面对大量数据时,ECB模式的加密速度会非常慢。此外,如果攻击者能够解密先前的数据块,那么他们就能够破解后续的数据块。

    2. CBC(串行密钥传输)模式

CBC是一种比ECB更加安全的加密模式。在CBC模式中,每个数据块都被分成两个部分:明文和密钥。第一个数据块被称为“前向块”,第二个数据块被称为“后向块”。前向块的密文是由密钥和前向块一起计算得到的,而后向块的密文则是由密钥和后向块一起计算得到的。这种模式可以确保即使攻击者能够获得密钥的一部分,也无法解密整个数据块。但是,CBC模式的速度较慢,因为需要处理大量的中间结果。

    3. CTR(计数器)模式

CTR模式与CBC模式非常相似,但是它使用了不同的密钥分配方法。在CTR模式中,每个数据块都由一个随机数生成器产生,该随机数生成器用于确定数据的索引位置。这使得CTR模式非常适合于流式数据传输,例如视频和音频流媒体。CTR模式也非常快,因为它只需要处理每个数据块的中间结果,而不需要像CBC模式那样处理整个数据块。

    4. CFB(可逆计数器)模式

CFB模式类似于CTR模式,但是它使用的是可变长度的密钥。在CFB模式中,每个数据块都有一个偏移量,这个偏移量是根据密钥计算出来的。这使得CFB模式非常适合于多通道应用程序,例如网络路由表。然而,由于密钥的长度可变,所以CFB模式不如CTR模式快速。

二、填充算法

填充算法用于填充输入数据以匹配AES模式的要求。下面是一些常用的填充算法及其优缺点:

    1. NoPadding

NoPadding是一种不使用填充算法的加密模式。这意味着输入数据将被直接编码为字节序列,而不会受到填充的影响。虽然NoPadding模式非常安全,但它会导致填充算法无法正确地处理数据。

    2. ZerosPadding

ZerosPadding是一种简单的填充算法,它将输入数据的最后一个字节替换为0。这种填充方式适用于所有AES加密模式,包括ECB、CBC和CTR模式。缺点是填充后的字节数量可能超过原始输入数据的大小。

    3. PKCS#5 padding

PKCS#5 padding是一种常见的填充算法,用于填充数据以符合AES模式的要求。这种填充方式使用一个固定长度的填充字节序列,以确保输入数据被完全填充。PKCS#5 padding的优点是它可以适应各种输入数据的大小,但缺点是填充过程可能很慢。

    4. PKCS#7 padding

PKCS#7 padding也是一种填充算法,它使用一个固定长度的填充字节序列来填充数据。这种填充方式的优点是可以适应各种输入数据的大小,并且填充过程相对较快。但是,它与PKCS#5 padding一样,可能需要较长的填充时间。 

三、工具类代码

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.apache.commons.codec.binary.Base64;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.spec.IvParameterSpec;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import java.io.PrintWriter;
  7. import java.io.StringWriter;
  8. /**
  9. * @Author: Duys
  10. * @date 2022/4/19 10:19
  11. * @描述:
  12. */
  13. @Slf4j
  14. public class AES128Utils {
  15. /**
  16. * AES_KEY 加密解密用的密钥Key,可以用26个字母和数字组成的16位,此处使用AES-128-CBC加密模式。
  17. * AES_VECTOR 向量, 普通aes加密解密需要为16位。
  18. */
  19. public static final String AES_KEY = "LX%TB*19!@#HPAZW";
  20. public static final String AES_VECTOR = "123f5678901234ad";
  21. /**
  22. * 加密
  23. */
  24. public static String encrypt(String sSrc, String key, String vector) throws Exception {
  25. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  26. byte[] raw = key.getBytes();
  27. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  28. IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
  29. cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
  30. byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
  31. return Base64.encodeBase64String(encrypted);// 此处使用BASE64做转码。
  32. }
  33. /**
  34. * 解密
  35. */
  36. public static String decrypt(String sSrc, String key, String ivs) {
  37. try {
  38. byte[] raw = key.getBytes("ASCII");
  39. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  40. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  41. IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());
  42. cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
  43. byte[] encrypted1 = Base64.decodeBase64(sSrc);
  44. byte[] original = cipher.doFinal(encrypted1);
  45. String originalString = new String(original, "utf-8");
  46. return originalString;
  47. } catch (Exception ex) {
  48. StringWriter sw = new StringWriter();
  49. PrintWriter printWriter = new PrintWriter(sw);
  50. ex.printStackTrace(printWriter);
  51. log.error("解密报错 >>> {}", sw, ex);
  52. return null;
  53. }
  54. }
  55. public static void main(String[] args) throws Exception {
  56. String str = "{\n" +
  57. " \"age\": 26,\n" +
  58. " \"fullAge\": \"26岁\",\n" +
  59. " \"ageUnit\": \"岁\",\n" +
  60. " \"areaCode\": \"1001\",\n" +
  61. " \"areaName\": \"区政务服务中心\",\n" +
  62. " \"checkTime\": \"2023-03-03 10:26:31\",\n" +
  63. " \"deptCode\": 1,\n" +
  64. " \"eqpCode\": \"-1\",\n" +
  65. " \"gatherTime\": \"2023-02-07 11:54:51\",\n" +
  66. " \"lczd\": \"临床诊断\",\n" +
  67. " \"lisInfoId\": \"1000000072\",\n" +
  68. " \"mobile\": \"15614132322\",\n" +
  69. " \"name\": \"张三\",\n" +
  70. " \"orderTime\": \"2023-02-07 11:54:42\",\n" +
  71. " \"patTypeCode\": 1,\n" +
  72. " \"patTypeName\": \"门诊\",\n" +
  73. " \"receiveTime\": \"2023-02-07 11:49:19\",\n" +
  74. " \"reportId\": \"1000000072\",\n" +
  75. " \"sex\": \"男\",\n" +
  76. " \"ssid\": \"130481199712121111\",\n" +
  77. " \"statusId\": 373,\n" +
  78. " \"testNum\": \"3\",\n" +
  79. " \"testTime\": \"2023-02-07 11:55:19\",\n" +
  80. " \"testTypeCode\": 41\n" +
  81. " }";
  82. String encryption = null;
  83. String decrypt = null;
  84. try {
  85. encryption = encrypt(str, AES_KEY, AES_VECTOR);//普通加密
  86. decrypt = decrypt(encryption, AES_KEY, AES_VECTOR);//普通解密
  87. } catch (Exception e) {
  88. e.printStackTrace();
  89. }
  90. System.out.println("加密:" + encryption);
  91. System.out.println("解密:" + decrypt);
  92. }
  93. }

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

闽ICP备14008679号