完整代码如下
package com.example.test;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends Activity {
private EditText E1;
private TextView T1,T2;
private Button B1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
E1 = (EditText)findViewById(R.id.E1);
T1 = (TextView)findViewById(R.id.T1);
T2 = (TextView)findViewById(R.id.T2);
B1 = (Button)findViewById(R.id.B1);
B1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String S1=E1.getText().toString();
T1.setText(S1);
try{
String scode;
byte[] btest,braw,bseed,bencode;
String seedkey="123";
bseed = seedkey.getBytes("utf-8");
braw = getRawKey(bseed);
String tobyte = E1.getText().toString();
btest = tobyte.getBytes("utf-8");
bencode = encry(braw, btest);
scode = new String(bencode,"ISO8859-1");
//加密完成,以下开始解密
byte[] bdecodetext,bdecoderaw,bdecodeseed,bdecode;
String sdecodekey = "123";
bdecodeseed = sdecodekey.getBytes("utf-8");
bdecoderaw = getRawKey(bdecodeseed);
bdecodetext = scode.getBytes("ISO8859-1");
bdecode = decry(bdecoderaw,bdecodetext);
String text1 = new String(bdecode,"utf-8");
T2.setText(text1);
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private byte[] getRawKey(byte[] seed) throws NoSuchAlgorithmException{
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); // 获得一个随机数,传入的参数为默认方式。
sr.setSeed(seed); // 设置一个种子,这个种子一般是用户设定的密码。也可以是其它某个固定的字符串
KeyGenerator keyGen = KeyGenerator.getInstance("AES"); // 获得一个key生成器(AES加密模式)
keyGen.init(128, sr); // 设置密匙长度128位
SecretKey key = keyGen.generateKey(); // 获得密匙
byte[] raw = key.getEncoded(); // 返回密匙的byte数组供加解密使用
return raw;
}
private byte[] encry(byte[] raw, byte[] input) throws Exception { // 加密
SecretKeySpec keySpec = new SecretKeySpec(raw, "AES"); // 根据上一步生成的密匙指定一个密匙(密匙二次加密?)
Cipher cipher = Cipher.getInstance("AES"); // 获得Cypher实例对象
cipher.init(Cipher.ENCRYPT_MODE, keySpec); // 初始化模式为加密模式,并指定密匙
byte[] encode = cipher.doFinal(input); // 执行加密操作。 input为需要加密的byte数组
return encode; // 返回加密后的密文(byte数组)
}
private byte[] decry(byte[] raw, byte[] encode) throws Exception{ // 解密
SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec); // 解密的的方法差不多,只是这里的模式不一样
byte[] decode = cipher.doFinal(encode); // 加解密都通过doFinal方法来执行最终的实际操作
return decode;
}
});
}
@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;
}
}
/*同样在Genymotion的虚拟机软件上测试,创建的Nexus S 4.1.1上最后就可以在T2上输出出来,在Galaxy Nexus 4.2.2上T2的内容就无法输出,以前完整的工程在实体机一台HTC的4.0.4机器上也能正确运行,但在一台华为4.2.2上就无法得出正确结果*/