AES 128/192/256位CBC/CFB/ECB/OFB/PCBC加密解密

Igor 软件攻城狮评论55,796字数 25289阅读84分17秒阅读模式

AES加解密总共有以下这些

  1. 算法/模式/填充 字节加密后数据长度 不满16字节加密后长度
  2. AES/CBC/NoPadding 16 不支持
  3. AES/CBC/PKCS5Padding 32 16
  4. AES/CBC/ISO10126Padding 32 16
  5. AES/CFB/NoPadding 16 原始数据长度
  6. AES/CFB/PKCS5Padding 32 16
  7. AES/CFB/ISO10126Padding 32 16
  8. AES/ECB/NoPadding 16 不支持
  9. AES/ECB/PKCS5Padding 32 16
  10. AES/ECB/ISO10126Padding 32 16
  11. AES/OFB/NoPadding 16 原始数据长度
  12. AES/OFB/PKCS5Padding 32 16
  13. AES/OFB/ISO10126Padding 32 16
  14. AES/PCBC/NoPadding 16 不支持
  15. AES/PCBC/PKCS5Padding 32 16
  16. AES/PCBC/ISO10126Padding 32 16

一、不带模式和填充来获取AES算法的时候,其默认使用AES/ECB/PKCS5Padding(输入可以不是16字节,也不需要填充向量)

  1. Cipher cipher = Cipher.getInstance("AES");

下面是 AES/ECB/PKCS5Padding 128位、192位、256加解密 完整代码

  1. String content = "在线助手";
  2. // 生成密钥需要的密码值
  3. String key = "www.it399.com";
  4. /**
  5. * AES加密方式一:AES不指定模式和填充,默认为 ECB/PKCS5Padding
  6. *
  7. * 不能使用填充向量
  8. * java.security.InvalidAlgorithmParameterException: ECB mode cannot use IV
  9. */
  10. System.out.println("【0】AES不指定模式和填充,默认为 ECB/PKCS5Padding,输入可以不是16字节,也不需要填充向量\n");
  11. //128
  12. byte[] encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
  13. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
  14. //192
  15. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_DEFAULT);
  16. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_DEFAULT);
  17. //256
  18. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
  19. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_DEFAULT);

结果如下:

  1. 0AES不指定模式和填充,默认为 ECB/PKCS5Padding,输入可以不是16字节,也不需要填充向量
  2. 秘钥长度,128,加密方式: AES,加密结果:09942AC3BB18703E2BAF29EC18E69BCC
  3. 秘钥长度,128,解密方式: AES,解密结果:在线助手
  4. 秘钥长度,192,加密方式: AES,加密结果:B9F574EF92836DFD2CC0EE03E7A0E717
  5. 秘钥长度,192,解密方式: AES,解密结果:在线助手
  6. 秘钥长度,256,加密方式: AES,加密结果:118CD83850A220EFD791FF6B1FF180F8
  7. 秘钥长度,256,解密方式: AES,解密结果:在线助手

二、AES/CBC 加密方式

2.1 AES/CBC/NoPadding
  • 输入必须是16字节,不然报错 javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
  • CBC模式必须提供初始向量IvParameterSpec,不然报错 java.security.InvalidKeyException: Parameters missing
  1. content 在线助手
  2. key www.it399.com111
  3. javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
  4. at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1041)
  5. at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:1009)
  6. at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
  7. at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
  8. at javax.crypto.Cipher.doFinal(Cipher.java:2165)
  9. at com.csy.spring.it399.controller.encode.aes.AESUtil.encrypt(AESUtil.java:80)
  10. at com.csy.spring.it399.controller.encode.aes.AESUtil.main(AESUtil.java:200)
  11. java.security.InvalidKeyException: Parameters missing
  12. at com.sun.crypto.provider.CipherCore.init(CipherCore.java:470)
  13. at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:313)
  14. at javax.crypto.Cipher.implInit(Cipher.java:802)
  15. at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
  16. at javax.crypto.Cipher.init(Cipher.java:1249)
  17. at javax.crypto.Cipher.init(Cipher.java:1186)
  18. at com.csy.spring.it399.controller.encode.aes.AESUtil.decrypt(AESUtil.java:117)
  19. at com.csy.spring.it399.controller.encode.aes.AESUtil.main(AESUtil.java:202)
  20. encode null
  21. decode null

初始化加密模式的时改成

  1. Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”);

java.security.InvalidKeyException: Parameters missing解决办法:

  1. if (modeAndPadding.equals(EncodeType.AES_CBC_NoPadding)) {
  2. //指定一个初始化向量 (Initialization vector,IV), IV 必须是16位
  3. cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(getIV()));
  4. } else {
  5. cipher.init(Cipher.ENCRYPT_MODE, keySpec);
  6. }

下面是 AES/CBC/NoPadding,AES/CBC/PKCS5Padding,AES/CBC/ISO10126Padding 128位,192位,256加密解密(文末附完整代码,点击此处使用AES128/192/256在线加密解密)

  1. /**
  2. * 1.1 AES/CBC
  3. * AES/CBC/NoPadding
  4. * AES/CBC/PKCS5Padding
  5. * AES/CBC/ISO10126Padding
  6. */
  7. System.out.println("【1.1】AES_CBC_NoPadding模式");
  8. content = "在线助手在线助手在线助手在线助手";
  9. key = "www.it399.com";
  10. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  11. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  12. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  13. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  14. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  15. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  1. 秘钥长度,128,加密方式: AES/CBC/NoPadding,加密结果:81C094D454913311113FA1E5B5A3B6778DC81026A19A52C51FAF54B82E48448A813E1FDE3F97E8ACE13FE37C550023DA
  2. 秘钥长度,128,解密方式: AES/CBC/NoPadding,解密结果:在线助手在线助手在线助手在线助手
  3. 秘钥长度,192,加密方式: AES/CBC/PKCS5Padding,加密结果:5BCD216A00741AB48668742393A8F995C63B4A875F6BD460BFB04DBCF5BF35E429C0C177A54D0DAFF7E38DD83EA11B0C434B836B8EAAE015666987377AF8C9D0
  4. 秘钥长度,192,解密方式: AES/CBC/PKCS5Padding,解密结果:在线助手在线助手在线助手在线助手
  5. 秘钥长度,256,加密方式: AES/CBC/ISO10126Padding,加密结果:1A45746F4E488AB13752033C21F9EE9C64417ECAA3A8FA08326D76DD1A052445218AA6D5408AC1D2F52998437C0786EEBC3990098DC36E6B7E6701474BA737D4
  6. 秘钥长度,256,解密方式: AES/CBC/ISO10126Padding,解密结果:在线助手在线助手在线助手在线助手

三、AES/CFB 加密方式

  • 需要填充变量,不然报如下错误
    1. Exception in thread "main" java.security.InvalidKeyException:
    2. Parameters missing
    下面是AES/CFB/NoPadding,AES/CFB/PKCS5Padding,AES/CFB/ISO10126Padding 128位,192位,256位加加密解密
    1. /**
    2. * 1.2 AES/CFB
    3. * AES/CBC/NoPadding
    4. * AES/CBC/PKCS5Padding
    5. * AES/CBC/ISO10126Padding
    6. */
    7. System.out.println("【1.2】AES_CFB_NoPadding模式\n");
    8. content = "在线助手";
    9. // 生成密钥需要的密码值
    10. key = "https://www.it399.com";
    11. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    12. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    13. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    14. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    15. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
    16. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);

四、AES/ECB 加密方式

  • AES/ECB不要填充变量,不然会报如下错误
    1. Exception in thread "main" java.security.InvalidAlgorithmParameterException: ECB mode
    2. cannot use IV

    下面是AES/ECB/NoPadding,AES/ECB/PKCS5Padding,AES/ECB/ISO10126Padding 128位,192位,256位加加密解密
    ```java

    1. /**
    2. * 1.3 AES/ECB
    3. * AES/ECB/NoPadding
    4. * AES/ECB/PKCS5Padding
    5. * AES/ECB/ISO10126Padding
    6. */
    7. System.out.println("【1.3】AES_ECB模式");
    8. content = "在线助手";
    9. // 生成密钥需要的密码值
    10. key = "https://www.it399.com";
    11. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
    12. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
    13. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
    14. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
    15. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
    16. encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
  1. ####五、AES/OFB 加密方式
  2. 下面是AES/OFB/NoPaddingAES/OFB/PKCS5PaddingAES/OFB/ISO10126Padding 128位,192位,256位加加密解密
  3. * 需要填充向量
  4. ```java
  5. /**
  6. * 1.4 AES/OFB
  7. * AES/OFB/NoPadding
  8. * AES/OFB/PKCS5Padding
  9. * AES/OFB/ISO10126Padding
  10. */
  11. System.out.println("【1.4】AES_OFB模式");
  12. content = "在线助手";
  13. // 生成密钥需要的密码值
  14. key = "https://www.it399.com";
  15. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
  16. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
  17. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
  18. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
  19. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
  20. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);

六、AES/PCBC 加密方式

下面是AES/PCBC/NoPadding,AES/PCBC/PKCS5Padding,AES/PCBC/ISO10126Padding 128位,192位,256位加加密解密

  • 需要填充向量
    1. /**
    2. * 1.5 AES/PCBC
    3. * AES/PCBC/NoPadding
    4. * AES/PCBC/PKCS5Padding
    5. * AES/PCBC/ISO10126Padding
    6. */
    7. System.out.println("【1.5】AES_PCBC模式");
    8. content = "在线助手";
    9. // 生成密钥需要的密码值
    10. key = "https://www.it399.com";
    11. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
    12. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
    13. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
    14. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
    15. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
    16. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);

七、完整代码

AESUtil .java

  1. import java.io.UnsupportedEncodingException;
  2. import java.security.InvalidAlgorithmParameterException;
  3. import java.security.InvalidKeyException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.SecureRandom;
  6. import javax.crypto.BadPaddingException;
  7. import javax.crypto.Cipher;
  8. import javax.crypto.IllegalBlockSizeException;
  9. import javax.crypto.KeyGenerator;
  10. import javax.crypto.NoSuchPaddingException;
  11. import javax.crypto.SecretKey;
  12. import javax.crypto.spec.IvParameterSpec;
  13. import javax.crypto.spec.SecretKeySpec;
  14. /**
  15. * 在线助手|在线工具|在线生成|在线制作
  16. * https://www.it399.com/
  17. * 在线助手博客
  18. * https://www.it399.com/blog/index
  19. */
  20. public class AESUtil {
  21. public static final String CHARSET = "UTF-8";
  22. private static byte[] encryptOrDecrypt(int mode,byte[] byteContent, String key,byte[] iv, AESType type, String modeAndPadding) throws InvalidKeyException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
  23. KeyGenerator kgen = KeyGenerator.getInstance("AES");
  24. //此处解决mac,linux报错
  25. SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
  26. random.setSeed(key.getBytes());
  27. kgen.init(type.value, random);
  28. SecretKey secretKey = kgen.generateKey();
  29. byte[] enCodeFormat = secretKey.getEncoded();
  30. SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, "AES");
  31. Cipher cipher = Cipher.getInstance(modeAndPadding);// 创建密码器
  32. if ( null !=iv ) {
  33. //指定一个初始化向量 (Initialization vector,IV), IV 必须是16位
  34. cipher.init(mode, keySpec, new IvParameterSpec(iv));
  35. } else {
  36. cipher.init(mode, keySpec);
  37. }
  38. byte[] result = cipher.doFinal(byteContent);
  39. return result;
  40. }
  41. public static void main(String[] args) throws Exception {
  42. // System.out.println("【1】AES不指定模式和填充,默认为 ECB/PKCS5Padding,输入可以不是16字节,也不需要填充向量\n");
  43. // // 需要加密的内容
  44. // String content = "在线助手";
  45. // // 生成密钥需要的密码值
  46. // String key = "www.it399.com111";
  47. // System.out.println("content: " + content + "\nkey: " + key);
  48. // byte[] encodeByte;
  49. // byte[] decodeByte;
  50. // //默认方式 每次加密都不一样,但是秘钥是一样的,所以解密还是一样的
  51. // // 内容加密后的值
  52. // encodeByte = encrypt(content.getBytes(CHARSET), key, AESType.AES_128, EncodeType.AES_DEFAULT);
  53. // String encodeStr = TypeConvert.bytesToHexString(encodeByte);
  54. // // 被加密的内容解密后的值
  55. // decodeByte = decrypt(encodeByte, key, AESType.AES_128, EncodeType.AES_DEFAULT);
  56. // String decodeStr = new String(decodeByte,CHARSET);
  57. // System.out.println("encode: " + encodeStr + "\ndecode: " + decodeStr);
  58. //
  59. //
  60. // System.out.println("【2】AES_CBC_NoPadding模式,输入必须是16*n字节,需要填充向量\n");
  61. // // 内容加密后的值
  62. // //待加密内容不足16*n位 报错javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
  63. // //需要填充向量,不然报错java.security.InvalidKeyException: Parameters missing
  64. // //得到加密后的内容先base64编码再解码再传给解码,不然直接转回乱码
  65. // content = "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈";
  66. // encodeByte = encrypt(content.getBytes(CHARSET), key, AESType.AES_256, EncodeType.AES_CBC_NoPadding);
  67. // encodeStr = TypeConvert.bytesToHexString(encodeByte);
  68. // decodeByte = decrypt(TypeConvert.hexStringToBytes(encodeStr), key, AESType.AES_256, EncodeType.AES_CBC_NoPadding);
  69. // decodeStr = new String(decodeByte,CHARSET);
  70. // System.out.println("encode: " + encodeStr + "\ndecode: " + decodeStr);
  71. String content = "在线助手";
  72. // 生成密钥需要的密码值
  73. String key = "www.it399.com";
  74. byte[] encrypt;
  75. /**
  76. * AES加密方式一:AES不指定模式和填充,默认为 ECB/PKCS5Padding
  77. */
  78. // System.out.println("【0】AES不指定模式和填充,默认为 ECB/PKCS5Padding,输入可以不是16字节,也不需要填充向量\n");
  79. // //128
  80. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
  81. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
  82. // //192
  83. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_DEFAULT);
  84. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_DEFAULT);
  85. // //256
  86. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
  87. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
  88. // /**
  89. // * 1.1 AES/CBC (需要填充向量16*n)
  90. // * AES/CBC/NoPadding
  91. // * AES/CBC/PKCS5Padding
  92. // * AES/CBC/ISO10126Padding
  93. // */
  94. // System.out.println("【1.1】AES_CBC_NoPadding模式,需要填充向量,待加密必须是16*n");
  95. // content = "在线助手在线助手在线助手在线助手";
  96. // key = "www.it399.com";
  97. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  98. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  99. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  100. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  101. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  102. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  103. // /**
  104. // * 1.2 AES/CFB
  105. // * AES/CBC/NoPadding
  106. // * AES/CBC/PKCS5Padding
  107. // * AES/CBC/ISO10126Padding
  108. // */
  109. // System.out.println("【1.2】AES_CFB_NoPadding模式\n");
  110. // content = "在线助手";
  111. // // 生成密钥需要的密码值
  112. // key = "https://www.it399.com";
  113. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
  114. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
  115. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
  116. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
  117. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
  118. // encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
  119. // /**
  120. // * 1.2 AES/ECB
  121. // * AES/ECB/NoPadding
  122. // * AES/ECB/PKCS5Padding
  123. // * AES/ECB/ISO10126Padding
  124. // */
  125. // System.out.println("【1.3】AES_ECB模式");
  126. // content = "在线助手";
  127. // // 生成密钥需要的密码值
  128. // key = "https://www.it399.com";
  129. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
  130. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
  131. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
  132. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
  133. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
  134. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
  135. /**
  136. * 1.4 AES/OFB
  137. * AES/OFB/NoPadding
  138. * AES/OFB/PKCS5Padding
  139. * AES/OFB/ISO10126Padding
  140. */
  141. System.out.println("【1.4】AES_OFB模式");
  142. content = "在线助手";
  143. // 生成密钥需要的密码值
  144. key = "https://www.it399.com";
  145. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
  146. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
  147. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
  148. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
  149. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
  150. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
  151. /**
  152. * 1.5 AES/PCBC
  153. * AES/PCBC/NoPadding
  154. * AES/PCBC/PKCS5Padding
  155. * AES/PCBC/ISO10126Padding
  156. */
  157. System.out.println("【1.5】AES_PCBC模式");
  158. content = "在线助手";
  159. // 生成密钥需要的密码值
  160. key = "https://www.it399.com";
  161. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
  162. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
  163. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
  164. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
  165. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
  166. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
  167. //
  168. // /**1.3 AES/CBC
  169. // * AES_CBC_NoPadding模式(填充向量可选)
  170. // */
  171. System.out.println("【1.3】AES_CBC_NoPadding模式");
  172. content = "在线助手在线助手在线助手在线助手";
  173. // 生成密钥需要的密码值
  174. key = "www.it399.com";
  175. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  176. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
  177. content = "在线助手";
  178. // 生成密钥需要的密码值
  179. key = "www.it399.com";
  180. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  181. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
  182. encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  183. encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
  184. //
  185. //
  186. //
  187. // /**
  188. // * 2.1 AES/CFB 128/192/256位加解密
  189. // * AES_CFB_NoPadding模式(填充向量可选)
  190. // */
  191. // System.out.println("【2.1】AES_CFB_NoPadding模式,需要填充向量\n");
  192. // content = "在线助手";
  193. // // 生成密钥需要的密码值
  194. // key = "www.it399.com";
  195. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_NoPadding);
  196. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_NoPadding);
  197. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_NoPadding);
  198. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_NoPadding);
  199. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_NoPadding);
  200. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_NoPadding);
  201. //
  202. // /**
  203. // * 2.2 AES/CFB
  204. // * AES_CFB_NoPadding模式(填充向量可选)
  205. // */
  206. // System.out.println("【2.2】AES_CFB_NoPadding模式\n");
  207. // content = "在线助手";
  208. // // 生成密钥需要的密码值
  209. // key = "www.it399.com";
  210. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
  211. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
  212. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
  213. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
  214. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
  215. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
  216. //
  217. // /**2.3 AES/CFB
  218. // * AES_CFB_NoPadding模式(填充向量可选)
  219. // */
  220. // System.out.println("【2.3】AES_CFB_NoPadding模式\n");
  221. // content = "在线助手";
  222. // // 生成密钥需要的密码值
  223. // key = "www.it399.com";
  224. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_ISO10126Padding);
  225. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_ISO10126Padding);
  226. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_ISO10126Padding);
  227. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_ISO10126Padding);
  228. // encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_ISO10126Padding);
  229. // encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_ISO10126Padding);
  230. }
  231. /**
  232. *
  233. * @param isEncrypt
  234. * @param source
  235. * @param key
  236. * @param type
  237. * @param encodeType
  238. */
  239. public static byte[] encryptOrdecrypt(boolean isEncrypt,byte[] source,String key,byte[] iv,AESType type,String encodeType) throws UnsupportedEncodingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
  240. if (isEncrypt){
  241. byte[] encodeByte = encryptOrDecrypt(Cipher.ENCRYPT_MODE,source,key,iv,type,encodeType);
  242. String encodeStr = TypeConvert.bytesToHexString(encodeByte);
  243. return encodeByte;
  244. }else{
  245. byte[] decodeByte = encryptOrDecrypt(Cipher.DECRYPT_MODE,source, key,iv,type, encodeType);
  246. String decodeStr = new String(decodeByte,CHARSET);
  247. return decodeByte;
  248. }
  249. }
  250. /**
  251. * 指定一个初始化向量 (Initialization vector,IV),IV 必须是16位
  252. */
  253. public static final byte[] getIV() throws Exception {
  254. return "1234567812345678".getBytes(CHARSET);
  255. }

EncodeType

  1. /**
  2. * 在线助手|在线工具|在线生成|在线制作
  3. * https://www.it399.com/
  4. * 在线助手博客
  5. * https://www.it399.com/blog/index
  6. */
  7. public class EncodeType {
  8. // 算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
  9. // AES/CBC/NoPadding 16 不支持
  10. // AES/CBC/PKCS5Padding 32 16
  11. // AES/CBC/ISO10126Padding 32 16
  12. // AES/CFB/NoPadding 16 原始数据长度
  13. // AES/CFB/PKCS5Padding 32 16
  14. // AES/CFB/ISO10126Padding 32 16
  15. // AES/ECB/NoPadding 16 不支持
  16. // AES/ECB/PKCS5Padding 32 16
  17. // AES/ECB/ISO10126Padding 32 16
  18. // AES/OFB/NoPadding 16 原始数据长度
  19. // AES/OFB/PKCS5Padding 32 16
  20. // AES/OFB/ISO10126Padding 32 16
  21. // AES/PCBC/NoPadding 16 不支持
  22. // AES/PCBC/PKCS5Padding 32 16
  23. // AES/PCBC/ISO10126Padding 32 16
  24. //默认为 ECB/PKCS5Padding
  25. public final static String AES_DEFAULT = "AES";
  26. public final static String AES_CBC_NoPadding = "AES/CBC/NoPadding";
  27. public final static String AES_CBC_PKCS5Padding = "AES/CBC/PKCS5Padding";
  28. public final static String AES_CBC_ISO10126Padding = "AES/CBC/ISO10126Padding";
  29. public final static String AES_CFB_NoPadding = "AES/CFB/NoPadding";
  30. public final static String AES_CFB_PKCS5Padding = "AES/CFB/PKCS5Padding";
  31. public final static String AES_CFB_ISO10126Padding = "AES/CFB/ISO10126Padding";
  32. public final static String AES_ECB_NoPadding = "AES/ECB/NoPadding";
  33. public final static String AES_ECB_PKCS5Padding = "AES/ECB/PKCS5Padding";
  34. public final static String AES_ECB_ISO10126Padding = "AES/ECB/ISO10126Padding";
  35. public final static String AES_OFB_NoPadding = "AES/OFB/NoPadding";
  36. public final static String AES_OFB_PKCS5Padding = "AES/OFB/PKCS5Padding";
  37. public final static String AES_OFB_ISO10126Padding = "AES/OFB/ISO10126Padding";
  38. public final static String AES_PCBC_NoPadding = "AES/PCBC/NoPadding";
  39. public final static String AES_PCBC_PKCS5Padding = "AES/PCBC/PKCS5Padding";
  40. public final static String AES_PCBC_ISO10126Padding = "AES/PCBC/ISO10126Padding";
  41. }

TypeConvert

  1. /**
  2. * 在线助手|在线工具|在线生成|在线制作
  3. * https://www.it399.com/
  4. * 在线助手博客
  5. * https://www.it399.com/blog/index
  6. */
  7. public class TypeConvert {
  8. /**
  9. * 字符串转换成十六进制字符串
  10. */
  11. public static String str2HexStr(String str) {
  12. char[] chars = "0123456789ABCDEF".toCharArray();
  13. StringBuilder sb = new StringBuilder("");
  14. byte[] bs = str.getBytes();
  15. int bit;
  16. for (int i = 0; i < bs.length; i++) {
  17. bit = (bs[i] & 0x0f0) >> 4;
  18. sb.append(chars[bit]);
  19. bit = bs[i] & 0x0f;
  20. sb.append(chars[bit]);
  21. }
  22. return sb.toString();
  23. }
  24. /**
  25. * Convert hex string to byte[]
  26. *
  27. * @param hexString the hex string
  28. * @return byte[]
  29. */
  30. public static byte[] hexStringToBytes(String hexString) {
  31. if (hexString == null || hexString.equals("")) {
  32. return null;
  33. }
  34. hexString = hexString.toUpperCase();
  35. int length = hexString.length() / 2;
  36. char[] hexChars = hexString.toCharArray();
  37. byte[] d = new byte[length];
  38. for (int i = 0; i < length; i++) {
  39. int pos = i * 2;
  40. d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
  41. }
  42. return d;
  43. }
  44. /**
  45. * Convert char to byte
  46. *
  47. * @param c char
  48. * @return byte
  49. */
  50. private static byte charToByte(char c) {
  51. return (byte) "0123456789ABCDEF".indexOf(c);
  52. }
  53. /**
  54. * 数组转换成十六进制字符串
  55. * @param bArray byte[]
  56. * @return HexString
  57. */
  58. public static final String bytesToHexString(byte[] bArray) {
  59. if (bArray == null || bArray.length==0){
  60. return null;
  61. }
  62. StringBuffer sb = new StringBuffer(bArray.length);
  63. String sTemp;
  64. for (int i = 0; i < bArray.length; i++) {
  65. sTemp = Integer.toHexString(0xFF & bArray[i]);
  66. if (sTemp.length() < 2){
  67. sb.append(0);
  68. }
  69. sb.append(sTemp.toUpperCase());
  70. }
  71. return sb.toString();
  72. }
  73. /**
  74. * 十六进制字符串转换成字符串
  75. * @param hexStr
  76. * @return String
  77. */
  78. public static String hexStr2Str(String hexStr) {
  79. String str = "0123456789ABCDEF";
  80. char[] hexs = hexStr.toCharArray();
  81. byte[] bytes = new byte[hexStr.length() / 2];
  82. int n;
  83. for (int i = 0; i < bytes.length; i++) {
  84. n = str.indexOf(hexs[2 * i]) * 16;
  85. n += str.indexOf(hexs[2 * i + 1]);
  86. bytes[i] = (byte) (n & 0xff);
  87. }
  88. return new String(bytes);
  89. }
  90. /**
  91. * @param hexString String str = "000AB"
  92. * @return
  93. */
  94. public static int hexString2Int(String hexString){
  95. Integer num = Integer.valueOf(hexString,16);
  96. return num;
  97. }
  98. /**
  99. * 把byte转为字符串的bit
  100. */
  101. public static String byteToBitString(byte b) {
  102. return ""
  103. + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)
  104. + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)
  105. + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)
  106. + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1);
  107. }
  108. /**
  109. * 把byte转为字符串数组的bit
  110. */
  111. public static String[] byteToBitStrings(byte b) {
  112. String[] bit = new String[8];
  113. bit[0] = ""+ (byte) ((b >> 7) & 0x1);
  114. bit[1] = ""+ (byte) ((b >> 6) & 0x1);
  115. bit[2] = ""+ (byte) ((b >> 5) & 0x1);
  116. bit[3] = ""+ (byte) ((b >> 4) & 0x1);
  117. bit[4] = ""+ (byte) ((b >> 3) & 0x1);
  118. bit[5] = ""+ (byte) ((b >> 2) & 0x1);
  119. bit[6] = ""+ (byte) ((b >> 1) & 0x1);
  120. bit[7] = ""+ (byte) ((b >> 0) & 0x1);
  121. return bit;
  122. }
  123. public static void main(String[] args){
  124. String hexString = "3A60432A5C01211F291E0F4E0C132825";
  125. byte[] result = hexStringToBytes(hexString);
  126. System.out.println(new String(result));
  127. System.out.println(bytesToHexString(result));
  128. }
  129. //base64字符串转byte[]
  130. public static byte[] base64String2ByteFun(String base64Str){
  131. return Base64.decodeBase64(base64Str);
  132. }
  133. //byte[]转base64
  134. public static String byte2Base64StringFun(byte[] b){
  135. return Base64.encodeBase64String(b);
  136. }
  137. }

AESType

  1. /**
  2. * 在线助手|在线工具|在线生成|在线制作
  3. * https://www.it399.com/
  4. * 在线助手博客
  5. * https://www.it399.com/blog/index
  6. */
  7. enum AESType {
  8. AES_128(128), AES_192(192), AES_256(256);
  9. public int value;
  10. private AESType(int value) {
  11. this.value = value;
  12. }
  13. public int getValue() {
  14. return value;
  15. }
  16. public void setValue(int value) {
  17. this.value = value;
  18. }
  19. }

文章末尾固定信息

历史上的今天
2 月
14
weinxin
我的微信
我的微信
一个码农、工程狮、集能量和智慧于一身的、DIY高手、小伙伴er很多的、80后奶爸。
 
Igor
  • 本文由 Igor 发表于 2019-02-1411:46:16
  • AES
  • AES128/192/256位
  • 加密解密
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证