密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之。
要区别4.2以上版本的调用方法,否则将会出现意想不到的问题。
AESCipher.java
package com.test;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESCipher {
public static String encrypt(String key, String src) throws Exception {
byte[] rawKey = getRawKey(key.getBytes());
byte[] result = encrypt(rawKey, src.getBytes());
return toHex(result);
}
public static String decrypt(String key, String encrypted) throws Exception {
byte[] rawKey = getRawKey(key.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法
SecureRandom sr = null;
if (android.os.Build.VERSION.SDK_INT >= 17) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
sr.setSeed(seed);
kgen.init(256, sr); //256 bits or 128 bits,192bits
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private static byte[] encrypt(byte[] key, byte[] src) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(src);
return encrypted;
}
private static byte[] decrypt(byte[] key, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
public static String toHex(String txt) {
return toHex(txt.getBytes());
}
public static String fromHex(String hex) {
return new String(toByte(hex));
}
public static byte[] toByte(String hexString) {
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
return result;
}
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2*buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private final static String HEX = "0123456789ABCDEF";
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}
}
TestAES.java
package com.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class TestAES extends Activity implements OnClickListener {
private TextView tvTip = null;
private EditText etKey = null;
private EditText etStr = null;
private Button btnEncrypt = null;
private Button btnDecrypt = null;
//
String src = null;
String key = null;
String dest = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvTip = (TextView) findViewById(R.id.tvTip);
etKey = (EditText) findViewById(R.id.etKey);
etStr = (EditText) findViewById(R.id.etStr);
btnEncrypt = (Button) findViewById(R.id.btnEncrypt);
btnEncrypt.setOnClickListener(this);
btnDecrypt = (Button) findViewById(R.id.btnDecrypt);
btnDecrypt.setOnClickListener(this);
btnEncrypt.setEnabled(true);
btnDecrypt.setEnabled(false);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == btnEncrypt) {
src = etStr.getText().toString().trim();
key = etKey.getText().toString().trim();
if (!src.equals("") && !key.equals("")) {
try {
dest = AESCipher.encrypt(key, src);
tvTip.setText("Encrypted:");
etStr.setText(dest);
btnEncrypt.setEnabled(false);
btnDecrypt.setEnabled(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else if (v == btnDecrypt) {
src = etStr.getText().toString().trim();
key = etKey.getText().toString().trim();
if (!src.equals("") && !key.equals("")) {
try {
dest = AESCipher.decrypt(key, src);
tvTip.setText("Decrypted:");
etStr.setText(dest);
btnDecrypt.setEnabled(false);
btnEncrypt.setEnabled(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
tvTip.setText("Source:");
btnDecrypt.setEnabled(false);
btnEncrypt.setEnabled(true);
}
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Key:" />
<EditText
android:id="@+id/etKey"
android:layout_width="200dp"
android:layout_height="40dp"
android:maxLength="32"
android:hint="Input the key" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tvTip"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Source:" />
<EditText
android:id="@+id/etStr"
android:layout_width="400dp"
android:layout_height="200dp"
android:hint="Input the source"
android:inputType="textMultiLine"
android:maxLength="4096"
android:maxLines="100"
android:scrollHorizontally="false" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btnEncrypt"
android:layout_width="120dp"
android:layout_height="50dp"
android:text="加密字符串" />
<Button
android:id="@+id/btnDecrypt"
android:layout_width="120dp"
android:layout_height="50dp"
android:text="解密字符串" />
</LinearLayout>
</LinearLayout>
源码:http://download.csdn.net/detail/xinzheng_wang/5639611