简介
AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB
我们项目里用的多的是较多的是AES/CBC/PKCS5PADDING,下面介绍下如何使用Java来实现加解密。
关于如何使用Javascript实现(加解密结果和Java版本互通),请查看这篇:[Javascript]实现对称加解密AES/CBC/PKCS5PADDING
Python版本的实现(加解密结果同样和本篇互通),请查看这篇:https://blog.terrynow.com/2021/04/16/python-tool-aes-cbc-pkcs5padding-implement/
Java实现加解密,纯代码干货
AesCBC.java:
/*
* Copyright (c) 2021.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.terrynow.test;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* @author Terry E-mail: yaoxinghuo at 126 dot com
* @date 2021-4-13 20:37
* @description
*/
public class AesCBC {
private final SecretKeySpec key;
private final IvParameterSpec iv;
/**
* 构造函数,传入key和iv
* @param key 一定需要16个字节的
* @param iv 一定需要16个字节的
*/
public AesCBC(String key, String iv) {
this.key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
this.iv = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
}
/**
* 构造函数,传入key和iv
* @param key 一定需要16个字节的bytes
* @param iv 一定需要16个字节的bytes
*/
public AesCBC(byte[] key, byte[] iv) {
this.key = new SecretKeySpec(key, "AES");
this.iv = new IvParameterSpec(iv);
}
/**
* AES加密
* @param source 明文string
* @return 加密后的bytes
*/
public byte[] encrypt(byte[] source) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return cipher.doFinal(source);
}
/**
* AES加密
* @param source 明文string
* @return 加密后的bytes转成十六进制string
*/
public String encryptToHexString(String source) {
try {
byte[] encrypted = encrypt(source.getBytes(StandardCharsets.UTF_8));
return HexBin.encode(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* AES加密
* @param source 明文string
* @return 加密后的bytes转成base64
*/
public String encryptToBase64(String source) {
try {
byte[] encrypted = encrypt(source.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* AES解密
* @param source bytes
* @return 解密后的bytes
*/
public byte[] decrypt(byte[] source) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
return cipher.doFinal(source);
}
/**
* AES解密
* @param source Base64编码的密文
* @return 解密后的明文string
*/
public String decryptWithBase64(String source) {
try {
byte[] original = decrypt(Base64.getDecoder().decode(source));
return new String(original);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* AES解密
* @param source 十六进制密文
* @return 解密后的明文string
*/
public String decryptWithHexString(String source) {
try {
byte[] original = decrypt(HexBin.decode(source));
return new String(original);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//测试
public static void main(String[] args) throws Exception {
// key和iv需要16个字符长度
// byte[] key = new byte[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
// byte[] iv = new byte[]{16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
String key = "sixteencharacter";//16位
String iv = "1234567890ABCDEF";//16位
AesCBC aesCBC = new AesCBC(key, iv);
String string1 = aesCBC.encryptToHexString("你好");
System.out.println(string1);//697E93390662D4EC94A2718FCC40DE0B
String string2 = aesCBC.encryptToBase64("你好");
System.out.println(string2);//aX6TOQZi1OyUonGPzEDeCw==
String string3 = aesCBC.decryptWithHexString("697E93390662D4EC94A2718FCC40DE0B");
System.out.println(string3);//你好
String string4 = aesCBC.decryptWithBase64("aX6TOQZi1OyUonGPzEDeCw==");
System.out.println(string4);//你好
}
}
/*
* Copyright (c) 2021.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.terrynow.test;
/**
* @author Terry E-mail: yaoxinghuo at 126 dot com
* @date 2019-03-01 10:00
* @description http://www.java2s.com/Code/Java/Data-Type/Decodehexstringtoabytearray.htm
* 把bytes转换成十六进制进制文本,或者把十六进制进制文本转成ytes
*/
public class HexBin {
static private final int BASELENGTH = 128;
static final private byte [] hexNumberTable = new byte[BASELENGTH];
static {
for (int i = 0; i < BASELENGTH; i++ ) {
hexNumberTable[i] = -1;
}
for ( int i = '9'; i >= '0'; i--) {
hexNumberTable[i] = (byte) (i-'0');
}
for ( int i = 'F'; i>= 'A'; i--) {
hexNumberTable[i] = (byte) ( i-'A' + 10 );
}
for ( int i = 'f'; i>= 'a'; i--) {
hexNumberTable[i] = (byte) ( i-'a' + 10 );
}
}
/**
* Decode hex string to a byte array
*
* @param encoded encoded string
* @return return array of byte to encode
*/
static public byte[] decode(String encoded) {
if (encoded == null)
return null;
int lengthData = encoded.length();
if (lengthData % 2 != 0)
return null;
char[] binaryData = encoded.toCharArray();
int lengthDecode = lengthData / 2;
byte[] decodedData = new byte[lengthDecode];
byte temp1, temp2;
char tempChar;
for( int i = 0; i<lengthDecode; i++ ){
tempChar = binaryData[i*2];
temp1 = (tempChar < BASELENGTH) ? hexNumberTable[tempChar] : -1;
if (temp1 == -1)
return null;
tempChar = binaryData[i*2+1];
temp2 = (tempChar < BASELENGTH) ? hexNumberTable[tempChar] : -1;
if (temp2 == -1)
return null;
decodedData[i] = (byte)((temp1 << 4) | temp2);
}
return decodedData;
}
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String encode(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
}
文章评论
cheap generic cialis Kqztcp Acticin Where To Purchase Website Fedex Shipping No Doctors Consult buy generic cialis online cheap comprar viagra en linea Controindicazioni Levitra Slvzeo best price cialis