Android AES加密工具类分享

1、AES加密工具类

java不支持PKCS7Padding,只支持PKCS5Padding。我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PKCS5Padding加密方式。

package com.example.aesdemo;

import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

///** AES对称加密解密类 **/
public class AESHelper {

 // /** 算法/模式/填充 **/
 private static final String CipherMode = "AES/ECB/PKCS5Padding";

 ///** 创建密钥 **/
 private static SecretKeySpec createKey(String password) {
 byte[] data = null;
 if (password == null) {
  password = "";
 }
 StringBuffer sb = new StringBuffer(32);
 sb.append(password);
 while (sb.length() < 32) {
  sb.append("0");
 }
 if (sb.length() > 32) {
  sb.setLength(32);
 }

 try {
  data = sb.toString().getBytes("UTF-8");
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }
 return new SecretKeySpec(data, "AES");
 }

 // /** 加密字节数据 **/
 public static byte[] encrypt(byte[] content, String password) {
 try {
  SecretKeySpec key = createKey(password);
  System.out.println(key);
  Cipher cipher = Cipher.getInstance(CipherMode);
  cipher.init(Cipher.ENCRYPT_MODE, key);
  byte[] result = cipher.doFinal(content);
  return result;
 } catch (Exception e) {
  e.printStackTrace();
 }
 return null;
 }

 ///** 加密(结果为16进制字符串) **/
 public static String encrypt(String content, String password) {
 byte[] data = null;
 try {
  data = content.getBytes("UTF-8");
 } catch (Exception e) {
  e.printStackTrace();
 }
 data = encrypt(data, password);
 String result = byte2hex(data);
 return result;
 }

 // /** 解密字节数组 **/
 public static byte[] decrypt(byte[] content, String password) {
 try {
  SecretKeySpec key = createKey(password);
  Cipher cipher = Cipher.getInstance(CipherMode);
  cipher.init(Cipher.DECRYPT_MODE, key);
  byte[] result = cipher.doFinal(content);
  return result;
 } catch (Exception e) {
  e.printStackTrace();
 }
 return null;
 }

 ///** 解密16进制的字符串为字符串 **/
 public static String decrypt(String content, String password) {
 byte[] data = null;
 try {
  data = hex2byte(content);
 } catch (Exception e) {
  e.printStackTrace();
 }
 data = decrypt(data, password);
 if (data == null)
  return null;
 String result = null;
 try {
  result = new String(data, "UTF-8");
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }
 return result;
 }

 // /** 字节数组转成16进制字符串 **/
 public static String byte2hex(byte[] b) { // 一个字节的数,
 StringBuffer sb = new StringBuffer(b.length * 2);
 String tmp = "";
 for (int n = 0; n < b.length; n++) {
  // 整数转成十六进制表示
  tmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
  if (tmp.length() == 1) {
  sb.append("0");
  }
  sb.append(tmp);
 }
 return sb.toString().toUpperCase(); // 转成大写
 }

 // /** 将hex字符串转换成字节数组 **/
 private static byte[] hex2byte(String inputString) {
 if (inputString == null || inputString.length() < 2) {
  return new byte[0];
 }
 inputString = inputString.toLowerCase();
 int l = inputString.length() / 2;
 byte[] result = new byte[l];
 for (int i = 0; i < l; ++i) {
  String tmp = inputString.substring(2 * i, 2 * i + 2);
  result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
 }
 return result;
 }
}

2、使用

新建Android工程

package com.example.aesdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.util.Log; 

public class MainActivity extends Activity {

 protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_main);

	 String masterPassword = "a";
	 String originalText = "于"; 

	 try {
	  String encryptingCode = AESHelper.encrypt(originalText,masterPassword);
//	  System.out.println("加密结果为 " + encryptingCode);
	  Log.i("加密结果为 ",encryptingCode);
	  String decryptingCode = AESHelper.decrypt(encryptingCode,masterPassword);
//	  System.out.println("解密结果为 " + decryptingCode);
	  Log.i("解密结果",decryptingCode);
	  } catch (Exception e) {
	  // TODO Auto-generated catch block
	  e.printStackTrace();
	 }
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

3、打印结果

09-19 10:41:05.467: I/加密结果为(707): E55C24701F6380478E1940ADDFD08D22
09-19 10:41:05.467: I/解密结果(707): 于
(0)

相关推荐

  • Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用

    安卓的三种本地的典型数据存储方式 SharedPreferences 以文件格式保存在本地存储中 SQL数据库 这篇文章就是讲解一下如何使用 SharedPreferences 保存文件.主要解释什么都写在注释里面的. IDE : Android Studio 参考文章:http://www.jb51.net/article/74215.htm 絮叨一下:本来文件操作这一块上周就想把其弄懂,然后继续进一步的学习.但是因为官方的 Android Training 之中的概念太过于繁杂.导致我认为存

  • android自动工具类TextUtils使用详解

    今天,简单讲讲如何使用android自动的工具类TextUtils. 简单列举部分用法: Log.d(TAG, "---------------------------------"); //字符串拼接 Log.d(TAG, TextUtils.concat("Hello", " ", "world!").toString()); //判断是否为空字符串 Log.d(TAG, TextUtils.isEmpty("H

  • 实例详解Android快速开发工具类总结

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

  • Android7.0 工具类:DiffUtil详解

    一 概述 DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集->新数据集的最小变化量. 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView. 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged(). 以前无脑mAdapter.notifyDataSetChanged()有两个缺点: 1.不会触发RecyclerView的动画(删

  • android实用工具类分享(获取内存/检查网络/屏幕高度/手机分辨率)

    复制代码 代码如下: public class CommonUtil { public static boolean hasSDCard() { String status = Environment.getExternalStorageState();  return status.equals(Environment.MEDIA_MOUNTED); } /**  * 获取最大内存  *   * @return  */ public static long getMaxMemory() { r

  • android 一些工具类汇总

    一 Paint ,Canvas public class drawView extends View{ private Paint paint1; public drawView(Context context,AttributeSet set ){ super(context,set); } public void onDraw(Canvas canvas){ super.onDraw(canvas); //new 一个画笔对象 paint1= new Paint(); canvas.draw

  • android开发教程之实现toast工具类

    Android中不用再每次都写烦人的Toast了,直接调用这个封装好的类,就可以使用了! 复制代码 代码如下: package com.zhanggeng.contact.tools; /** * Toasttool can make you  use Toast more easy ;  *  * @author ZHANGGeng * @version v1.0.1 * @since JDK5.0 * */import android.content.Context;import andro

  • Android屏幕分辨率工具类使用详解

    Android开发中我们经常需要用到将dip.px相互换算.获取手机屏幕的宽度.高度以及状态栏高度等,如下是基于屏幕这一块整理的一个类. package com.per.loadingwebviewdome; import android.content.Context; import android.util.DisplayMetrics; import java.lang.reflect.Field; /** * @author: xiaolijuan * @description: 屏幕分

  • Android封装的http请求实用工具类

    复制代码 代码如下: import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URLEncoder;import java.security.KeyStore;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry; import org.apache.http

  • 19个Android常用工具类汇总

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.

随机推荐