AES Encryption
AES is a reversible encryption algorithm that encrypts users' sensitive information.
This article will not delve into the principles of AES for the time being, but only focuses on the JAVA code to implement AES encryption and decryption.
JAVA code implementation
It is recommended that the encryption password be 16 digits to avoid adding 0 if the number of password digits is insufficient, resulting in inconsistent passwords and encryption and decryption errors.
IOS can set an encryption password of any length. JAVA only supports 16 bits/24 bits/32 bits. I don’t know if it can be of any length. I hope you can tell me.
package cn.roylion.common.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; /** * @Author: Roylion * @Description: AES算法封装 * @Date: Created in 9:46 2018/8/9 */ public class EncryptUtil{ /** * 加密算法 */ private static final String ENCRY_ALGORITHM = "AES"; /** * 加密算法/加密模式/填充类型 * 本例采用AES加密,ECB加密模式,PKCS5Padding填充 */ private static final String CIPHER_MODE = "AES/ECB/PKCS5Padding"; /** * 设置iv偏移量 * 本例采用ECB加密模式,不需要设置iv偏移量 */ private static final String IV_ = null; /** * 设置加密字符集 * 本例采用 UTF-8 字符集 */ private static final String CHARACTER = "UTF-8"; /** * 设置加密密码处理长度。 * 不足此长度补0; */ private static final int PWD_SIZE = 16; /** * 密码处理方法 * 如果加解密出问题, * 请先查看本方法,排除密码长度不足补"0",导致密码不一致 * @param password 待处理的密码 * @return * @throws UnsupportedEncodingException */ private static byte[] pwdHandler(String password) throws UnsupportedEncodingException { byte[] data = null; if (password == null) { password = ""; } StringBuffer sb = new StringBuffer(PWD_SIZE); sb.append(password); while (sb.length() < PWD_SIZE) { sb.append("0"); } if (sb.length() > PWD_SIZE) { sb.setLength(PWD_SIZE); } data = sb.toString().getBytes("UTF-8"); return data; } //======================>原始加密<====================== /** * 原始加密 * @param clearTextBytes 明文字节数组,待加密的字节数组 * @param pwdBytes 加密密码字节数组 * @return 返回加密后的密文字节数组,加密错误返回null */ public static byte[] encrypt(byte[] clearTextBytes, byte[] pwdBytes) { try { // 1 获取加密密钥 SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM); // 2 获取Cipher实例 Cipher cipher = Cipher.getInstance(CIPHER_MODE); // 查看数据块位数 默认为16(byte) * 8 =128 bit // System.out.println("数据块位数(byte):" + cipher.getBlockSize()); // 3 初始化Cipher实例。设置执行模式以及加密密钥 cipher.init(Cipher.ENCRYPT_MODE, keySpec); // 4 执行 byte[] cipherTextBytes = cipher.doFinal(clearTextBytes); // 5 返回密文字符集 return cipherTextBytes; } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 原始解密 * @param cipherTextBytes 密文字节数组,待解密的字节数组 * @param pwdBytes 解密密码字节数组 * @return 返回解密后的明文字节数组,解密错误返回null */ public static byte[] decrypt(byte[] cipherTextBytes, byte[] pwdBytes) { try { // 1 获取解密密钥 SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM); // 2 获取Cipher实例 Cipher cipher = Cipher.getInstance(CIPHER_MODE); // 查看数据块位数 默认为16(byte) * 8 =128 bit // System.out.println("数据块位数(byte):" + cipher.getBlockSize()); // 3 初始化Cipher实例。设置执行模式以及加密密钥 cipher.init(Cipher.DECRYPT_MODE, keySpec); // 4 执行 byte[] clearTextBytes = cipher.doFinal(cipherTextBytes); // 5 返回明文字符集 return clearTextBytes; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // 解密错误 返回null return null; } //======================>BASE64<====================== /** * BASE64加密 * @param clearText 明文,待加密的内容 * @param password 密码,加密的密码 * @return 返回密文,加密后得到的内容。加密错误返回null */ public static String encryptBase64(String clearText, String password) { try { // 1 获取加密密文字节数组 byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password)); // 2 对密文字节数组进行BASE64 encoder 得到 BASE6输出的密文 BASE64Encoder base64Encoder = new BASE64Encoder(); String cipherText = base64Encoder.encode(cipherTextBytes); // 3 返回BASE64输出的密文 return cipherText; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // 加密错误 返回null return null; } /** * BASE64解密 * @param cipherText 密文,带解密的内容 * @param password 密码,解密的密码 * @return 返回明文,解密后得到的内容。解密错误返回null */ public static String decryptBase64(String cipherText, String password) { try { // 1 对 BASE64输出的密文进行BASE64 decodebuffer 得到密文字节数组 BASE64Decoder base64Decoder = new BASE64Decoder(); byte[] cipherTextBytes = base64Decoder.decodeBuffer(cipherText); // 2 对密文字节数组进行解密 得到明文字节数组 byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password)); // 3 根据 CHARACTER 转码,返回明文字符串 return new String(clearTextBytes, CHARACTER); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // 解密错误返回null return null; } //======================>HEX<====================== /** * HEX加密 * @param clearText 明文,待加密的内容 * @param password 密码,加密的密码 * @return 返回密文,加密后得到的内容。加密错误返回null */ public static String encryptHex(String clearText, String password) { try { // 1 获取加密密文字节数组 byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password)); // 2 对密文字节数组进行 转换为 HEX输出密文 String cipherText = byte2hex(cipherTextBytes); // 3 返回 HEX输出密文 return cipherText; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // 加密错误返回null return null; } /** * HEX解密 * @param cipherText 密文,带解密的内容 * @param password 密码,解密的密码 * @return 返回明文,解密后得到的内容。解密错误返回null */ public static String decryptHex(String cipherText, String password) { try { // 1 将HEX输出密文 转为密文字节数组 byte[] cipherTextBytes = hex2byte(cipherText); // 2 将密文字节数组进行解密 得到明文字节数组 byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password)); // 3 根据 CHARACTER 转码,返回明文字符串 return new String(clearTextBytes, CHARACTER); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // 解密错误返回null return null; } /*字节数组转成16进制字符串 */ public static String byte2hex(byte[] bytes) { // 一个字节的数, StringBuffer sb = new StringBuffer(bytes.length * 2); String tmp = ""; for (int n = 0; n < bytes.length; n++) { // 整数转成十六进制表示 tmp = (java.lang.Integer.toHexString(bytes[n] & 0XFF)); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); } return sb.toString().toUpperCase(); // 转成大写 } /*将hex字符串转换成字节数组 */ private static byte[] hex2byte(String str) { if (str == null || str.length() < 2) { return new byte[0]; } str = str.toLowerCase(); int l = str.length() / 2; byte[] result = new byte[l]; for (int i = 0; i < l; ++i) { String tmp = str.substring(2 * i, 2 * i + 2); result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF); } return result; } public static void main(String[] args) { String test = encryptHex("test", "1234567800000000"); System.out.println(test); System.out.println(decryptHex(test, "1234567800000000")); } }
Related recommendations:
Encryption and decryption - using php to implement aes encryption in java
AES encryption and decryption C# code
The above is the detailed content of JAVA code implementation: AES encryption. For more information, please follow other related articles on the PHP Chinese website!

Java is widely used in enterprise-level applications because of its platform independence. 1) Platform independence is implemented through Java virtual machine (JVM), so that the code can run on any platform that supports Java. 2) It simplifies cross-platform deployment and development processes, providing greater flexibility and scalability. 3) However, it is necessary to pay attention to performance differences and third-party library compatibility and adopt best practices such as using pure Java code and cross-platform testing.

JavaplaysasignificantroleinIoTduetoitsplatformindependence.1)Itallowscodetobewrittenonceandrunonvariousdevices.2)Java'secosystemprovidesusefullibrariesforIoT.3)ItssecurityfeaturesenhanceIoTsystemsafety.However,developersmustaddressmemoryandstartuptim

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java'splatformindependenceissignificantbecauseitallowsdeveloperstowritecodeonceandrunitonanyplatformwithaJVM.This"writeonce,runanywhere"(WORA)approachoffers:1)Cross-platformcompatibility,enablingdeploymentacrossdifferentOSwithoutissues;2)Re

Java is suitable for developing cross-server web applications. 1) Java's "write once, run everywhere" philosophy makes its code run on any platform that supports JVM. 2) Java has a rich ecosystem, including tools such as Spring and Hibernate, to simplify the development process. 3) Java performs excellently in performance and security, providing efficient memory management and strong security guarantees.

JVM implements the WORA features of Java through bytecode interpretation, platform-independent APIs and dynamic class loading: 1. Bytecode is interpreted as machine code to ensure cross-platform operation; 2. Standard API abstract operating system differences; 3. Classes are loaded dynamically at runtime to ensure consistency.

The latest version of Java effectively solves platform-specific problems through JVM optimization, standard library improvements and third-party library support. 1) JVM optimization, such as Java11's ZGC improves garbage collection performance. 2) Standard library improvements, such as Java9's module system reducing platform-related problems. 3) Third-party libraries provide platform-optimized versions, such as OpenCV.

The JVM's bytecode verification process includes four key steps: 1) Check whether the class file format complies with the specifications, 2) Verify the validity and correctness of the bytecode instructions, 3) Perform data flow analysis to ensure type safety, and 4) Balancing the thoroughness and performance of verification. Through these steps, the JVM ensures that only secure, correct bytecode is executed, thereby protecting the integrity and security of the program.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Notepad++7.3.1
Easy-to-use and free code editor

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function
