AES简介
AES是最常见的对称加密算法,CBC模式必须要设置偏移量,可以和密钥一致。java没有提供ZeroPadding的填充方式,可以用NoPadding方式替代。
标题加解密具体完整实现
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
public class AesEncryptUtil {
private static final String INSTANCE = "AES/CBC/NoPadding";
private static final String ALGORITHM = "AES";
public static String encryption(String data, String key, String iv) {
try {
Cipher cipher = Cipher.getInstance(INSTANCE);
int blockSize = cipher.getBlockSize();
byte[] dataBytes = DatatypeConverter.parseHexBinary(data);
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength += blockSize - plaintextLength % blockSize;
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(plaintext);
return DatatypeConverter.printHexBinary(encrypted);
} catch (Exception var11) {
var11.printStackTrace();
return null;
}
}
public static String decryption(String data, String key, String iv) {
try {
Cipher cipher = Cipher.getInstance(INSTANCE);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] original = cipher.doFinal(DatatypeConverter.parseHexBinary(data));
return DatatypeConverter.printHexBinary(getRealBytes(original));
} catch (Exception var8) {
var8.printStackTrace();
return null;
}
}
public static byte[] getRealBytes(byte[] src){
int index=0;
for (int i = src.length-1; i >=0 ; i--) {
if (src[i] != 0) {
index = i;
break;
}
}
byte[] dest = new byte[index+1]; // 创建目标数组,长度为要截取的长度
System.arraycopy(src, 0, dest, 0, index+1);
return dest;
}
public static void main(String[] args) {
String encryption = encryption("0203001400268427", "1234567890abcdef", "1234567890abcdef");
String decryption = decryption(encryption, "1234567890abcdef", "1234567890abcdef");
System.out.println(decryption);
}
}