密码学中的高级加密标准(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>