Issue
I use this code for encrypting Strings and it works perfectly:
public class Encryption {
public String encrypt(String seed, String cleartext) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}
public String decrypt(String seed, String encrypted) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
public String toHex(String txt) {
return toHex(txt.getBytes());
}
public String fromHex(String hex) {
return new String(toByte(hex));
}
public 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 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 void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}
But I was wondering if it's possible to run this code in AsyncTask and display a ProgressDialog with the current process. It's no problem to run the code in an AsyncTask class, but I have no idea how I get the current progress.
Edit: I use this code for running the code in an AsyncTask:
private class EncryptData extends AsyncTask<String, Integer, String> {
ProgressDialog pd;
@Override
protected void onPreExecute() {
pd = new ProgressDialog(MainActivity.this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Processing Data...");
pd.setCancelable(false);
pd.show();
}
@Override
protected String doInBackground(String... arg0) {
Encryption encryptText = new Encryption();
String result = "";
try {
result = encryptText.encrypt("123", arg0[0]);
} catch (Exception e) {
}
return result;
}
@Override
protected void onProgressUpdate(Integer... progress) {
pd.setProgress((int) (progress[0]));
pd.setMessage("Processing Data... (" + progress[0] + "%)");
}
@Override
protected void onPostExecute(String ui) {
setEncryptedData(ui);
pd.dismiss();
}
}
I want to use this code to encrypt a few MB of data.
Edit: I added this code to Ecryption:
public int getProcess() {
return ((int) (offset / totalSize) * 100);
}
public void setProgress(int totalSize, int offset) {
this.totalSize = totalSize;
this.offset = offset;
}
Solution
You call doFinal(byte[]). This way you cannot get progress information from the Cipher. When you change to update (byte[], offset etc) you can chunk your data and show your progress in the loop. finish with do final btw.
you might end up with something like (from the head)
private byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
int offset = 0;
byte[] encrypted;
while(offset < clear.length()) {
final byte[] answer = cipher.update(clear, offset, 1024);
encrypted = Arrays.copyOf( encrypted, encrypted.length + 1024);
System.arrayCopy(answer, 0, encrypted, offset, 1024);
offset += 1024;
}
encrypted += cipher.doFinal(clear, offset, clear.length() - offset);
return encrypted;
}
Answered By - dmaij
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.