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!

1.背景知识在密码学中,加密算法分为单向加密和双向加密。对称加密是指加密和解密使用相同的密钥,包括AES加密、DES加密等。非对称加密是指加密和解密使用不同的密钥,包括RSA加密等。单向加密包括MD5、SHA等摘要算法,它们是不可逆的。双向加密包括对称加密和非对称加密。双向加密是可逆的,存在密文的密钥。2.AES简介AES:高级加密标准(AdvancedEncryptionStandard)是美国联邦政府采用的一种区块加密标准,是目前最流行的一种对称加密算法。是用来替代DES的新一代分组加密算法

一、讲个事故接口安全老生常谈了过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的,为了接口安全我,我和前端约定了传递参数是:用户无限模式的积分+“我们约定的一个数字”+用户id的和,在用Base64加密,请求到服务器我再解密,出用户无限模式的积分;如下:{"integral":"MTExMTM0NzY5NQ==",}可是过年的时候,运营突然找我说无限模式积分排行榜分数不对:这就很诡异了,第二名才一

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

随着互联网的发展和普及,数据的安全性越来越受到重视。在数据传输和存储过程中,加密技术是一种非常有效的手段,通过加密可以保证数据的机密性和完整性。而在PHP中,AES256加密技术是一种非常流行的加密方式,本文将详细介绍其在框架中的应用方法。AES256加密技术简介AES(AdvancedEncryptionStandard)即高级加密标准,是现代流行的对

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。


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

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

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

Dreamweaver Mac version
Visual web development tools

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

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft
