java 对称加密工具类_java AES对称加密工具类

packagecom.util;importjava.io.UnsupportedEncodingException;importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;/*** AES加密工具类

*@authorxWang

* @Date 2019-08-27*/

public classAesEncodeUtil {//偏移量

public static final String VIPARA = "1234567876543210"; //AES 为16bytes. DES 为8bytes//编码方式

public static final String CODE_TYPE = "UTF-8";//public static final String CODE_TYPE = "GBK";//填充类型

public static final String AES_TYPE = "AES/ECB/PKCS5Padding";//public static final String AES_TYPE = "AES/ECB/PKCS7Padding";//此类型 加密内容,密钥必须为16字节的倍数位,否则抛异常,需要字节补全再进行加密//public static final String AES_TYPE = "AES/ECB/NoPadding";//java 不支持ZeroPadding//public static final String AES_TYPE = "AES/CBC/ZeroPadding";//私钥

private static final String AES_KEY="1111222233334444"; //AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。//字符补全

private static final String[] consult = new String[]{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G"};/*** 加密

*

*@paramcleartext

*@return

*/

public staticString encrypt(String cleartext) {//加密方式: AES128(CBC/PKCS5Padding) + Base64, 私钥:1111222233334444

try{

IvParameterSpec zeroIv= newIvParameterSpec(VIPARA.getBytes());//两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES

SecretKeySpec key = new SecretKeySpec(AES_KEY.getBytes(), "AES");//实例化加密类,参数为加密方式,要写全

Cipher cipher = Cipher.getInstance(AES_TYPE); //PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密//初始化,此方法可以采用三种方式,按加密算法要求来添加。(1)无第三个参数(2)第三个参数为SecureRandom random = new SecureRandom();中random对象,随机数。(AES不可采用这种方法)(3)采用此代码中的IVParameterSpec//加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE;

cipher.init(Cipher.ENCRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量//加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式

byte[] encryptedData =cipher.doFinal(cleartext.getBytes(CODE_TYPE));return newBASE64Encoder().encode(encryptedData);

}catch(Exception e) {

e.printStackTrace();return "";

}

}/*** 解密

*

*@paramencrypted

*@return

*/

public staticString decrypt(String encrypted) {try{byte[] byteMi = newBASE64Decoder().decodeBuffer(encrypted);

IvParameterSpec zeroIv= newIvParameterSpec(VIPARA.getBytes());

SecretKeySpec key= newSecretKeySpec(

AES_KEY.getBytes(),"AES");

Cipher cipher=Cipher.getInstance(AES_TYPE);//与加密时不同MODE:Cipher.DECRYPT_MODE

cipher.init(Cipher.DECRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量

byte[] decryptedData =cipher.doFinal(byteMi);return newString(decryptedData, CODE_TYPE);

}catch(Exception e) {

e.printStackTrace();return "";

}

}/*** 测试

*

*@paramargs

*@throwsException*/

public static void main(String[] args) throwsException {

String content= "你笑起来真好看";

test(content);

}public static void test(String content) throwsUnsupportedEncodingException{

System.out.println("加密内容:" +content);//字节数

int num =content.getBytes(CODE_TYPE).length;

System.out.println("加密内容字节数: " +num);

System.out.println("加密内容是否16倍数: " + (num%16 == 0 ? true : false));//字节补全

if(AES_TYPE.equals("AES/ECB/NoPadding")){

System.out.println();

content=completionCodeFor16Bytes(content);

System.out.println("加密内容补全后: "+content);

}

System.out.println();//加密

String encryptResult =encrypt(content);

content= newString(encryptResult);

System.out.println("加密后:" +content);

System.out.println();//解密

String decryptResult =decrypt(encryptResult);

content= newString(decryptResult);//还原

if(AES_TYPE.equals("AES/ECB/NoPadding")){

System.out.println("解密内容还原前: "+content);

content=resumeCodeOf16Bytes(content);

}

System.out.println("解密完成后:" +content);

}//NoPadding//补全字符

public static String completionCodeFor16Bytes(String str) throwsUnsupportedEncodingException{int num =str.getBytes(CODE_TYPE).length;int index = num%16;//进行加密内容补全操作, 加密内容应该为 16字节的倍数, 当不足16*n字节是进行补全, 差一位时 补全16+1位//补全字符 以 $ 开始,$后一位代表$后补全字符位数,之后全部以0进行补全;

if(index != 0){

StringBuffer sbBuffer= newStringBuffer(str);if(16-index == 1){

sbBuffer.append("$" + consult[16-1] + addStr(16-1-1));

}else{

sbBuffer.append("$" + consult[16-index-1] + addStr(16-index-1-1));

}

str=sbBuffer.toString();

}returnstr;

}//追加字符

public static String addStr(intnum){

StringBuffer sbBuffer= new StringBuffer("");for (int i = 0; i < num; i++) {

sbBuffer.append("0");

}returnsbBuffer.toString();

}//还原字符(进行字符判断)

public staticString resumeCodeOf16Bytes(String str){int indexOf = str.lastIndexOf("$");if(indexOf == -1){returnstr;

}

String trim= str.substring(indexOf+1,indexOf+2).trim();int num = 0;for (int i = 0; i < consult.length; i++) {if(trim.equals(consult[i])){

num=i;

}

}if(num == 0){returnstr;

}return str.substring(0,indexOf).trim();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值