I am trying to implement AES 128 bit encryption for android. On cipher.doFinal the process gets stopped. Its not going into the catch block also. Have attached the code.
public class MainActivity extends Activity {
EditText encryptText;
Button encryptButton;
String key = "16bitkey";
String requestData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
public void initViews(){
encryptText = (EditText) findViewById(R.id.encryptText);
encryptButton = (Button) findViewById(R.id.encryptButton);
encryptButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new event_background().execute();
}
});
}
@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;
}
public void performSocketRequest(){
try{
requestData = encryptText.getText().toString();
byte[] keyInBytes = convertToByteArray(key);
byte[] requestInBytes = convertToByteArray(requestData);
byte[] aesEncryptedData = aesEncryption(keyInBytes, requestInBytes);
}
catch(Exception e){
}
}
public byte[] convertToByteArray(String data){
byte[] bytes = null;
try{
bytes = data.getBytes("UTF8");
}catch(Exception e){
}
return bytes;
}
public byte[] aesEncryption(byte[] raw, byte[] clear) throws Exception{
try{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(raw);
kgen.init(128, sr);
SecretKey skey = kgen.generateKey();
byte[] keyTemp = skey.getEncoded();
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeySpec skeySpec = new SecretKeySpec(keyTemp, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
return cipher.doFinal(clear);
}catch(IllegalBlockSizeException e){
Log.e("*********** IllegalBlockSizeException error **************", e.getMessage());
}catch(BadPaddingException e){
Log.e("*********** BadPaddingException error **************", e.getMessage());
}catch(Exception e){
Log.e("*********** error **************", e.getMessage());
}
return null;
}
class event_background extends AsyncTask<Void, String, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void unused) {
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
performSocketRequest();
return null;
}
}
}
Another way to archive encryption/decryption:
Usage
Encrypt:
MCrypt mcrypt = new MCrypt();
String encrypted = MCrypt.bytesToHex(mcrypt.encrypt("Text to Encrypt"));
Decrypt:
MCrypt mcrypt = new MCrypt();
String decrypted = new String(mcrypt.decrypt(encrypted));
Class Code: (tested and works on 2.1+ devices. Not tested at 4+ but supposed to work)
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class MCrypt {
private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
private IvParameterSpec ivspec;
private SecretKeySpec keyspec;
private Cipher cipher;
private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)
public MCrypt() {
ivspec = new IvParameterSpec(iv.getBytes());
keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");
try {
cipher = Cipher.getInstance("AES/CBC/NoPadding");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
public byte[] encrypt(String text) throws Exception {
if (text == null || text.length() == 0) throw new Exception("Empty string");
byte[] encrypted = null;
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
encrypted = cipher.doFinal(padString(text).getBytes());
try { // for OS version 2.2+
encrypted = android.util.Base64.encode(encrypted, android.util.Base64.NO_PADDING);
} catch (NoClassDefFoundError e) {
encrypted = org.apache.commons.codec.binary.Base64.encodeBase64(encrypted);
}
return encrypted;
}
public byte[] decrypt(String code) throws Exception {
if (code == null || code.length() == 0) throw new Exception("Empty string");
byte[] decrypted = null;
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
try { // for OS version 2.2+
decrypted = cipher.doFinal(android.util.Base64.decode(code, android.util.Base64.NO_PADDING));
} catch (NoClassDefFoundError e) {
decrypted = cipher.doFinal(org.apache.commons.codec.binary.Base64.decodeBase64(code.getBytes("UTF-8")));
}
return decrypted;
}
private static String padString(String source) {
char paddingChar = ' ';
int size = 16;
int x = source.length() % size;
int padLength = size - x;
for (int i = 0; i < padLength; i++) {
source += paddingChar;
}
return source;
}
}
related link : http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php
来源:https://stackoverflow.com/questions/15356954/aes-128-bit-encryption-not-working