To keep it simple I am using a hard coded key and IV for now.
AesWriter (below) encrypts and writes the original plaintext, Abc\t1234\t\t\t\t\n, to a file as 11,87,-74,122,-127,48,-118,39,82,-83,68,-30,-84.
But AesReader (also below) decrypts the contents of the file consistently as zW?D?4?rc?~???~?_=p?J. Any ideas where I am going wrong?
public class AesWriter extends Activity {
...
private void writeConfig() {
...
try {
Cipher cipher = Cipher.getInstance(AesReader.AES_ALGORITHM,
AesReader.PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, AesReader.getSecretKeySpec(),
AesReader.getIvParameterSpec());
byte[] encrypted = cipher.doFinal(config.getBytes());
OutputStreamWriter out =
new OutputStreamWriter(openFileOutput(fileName, 0));
out.write(AesReader.asHex(encrypted));
out.close();
...
public class AesReader extends Activity {
public static final String AES_ALGORITHM = "AES/CTR/NoPadding";
public static final String PROVIDER = "BC";
private static final byte[] aesKey128 = { // Hard coded for now
78, -90, 42, 70, -5, 20, -114, 103,
-99, -25, 76, 95, -85, 94, 57, 54};
private static final byte[] ivBytes = { // Hard coded for now
-85, -67, -5, 88, 28, 49, 49, 85,
114, 83, -40, 119, -65, 91, 76, 108};
private static final SecretKeySpec secretKeySpec =
new SecretKeySpec(aesKey128, "AES");
private static final IvParameterSpec ivSpec =
new IvParameterSpec(ivBytes);
...
private void readConfig() {
String fileName = configuration.getFileName();
try {
InputStream is = openFileInput(fileName);
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
CipherInputStream cis = new CipherInputStream(is, cipher);
InputStreamReader isr = new InputStreamReader(cis);
BufferedReader reader = new BufferedReader(isr);
String s;
while ((s = reader.readLine()) != null) {
configuration.modify(s);
}
is.close();
...
public static SecretKeySpec getSecretKeySpec() {
return secretKeySpec;
}
public static IvParameterSpec getIvParameterSpec() {
return ivSpec;
}
public static String asHex(byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10) {
strbuf.append("0");
}
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
Working code based on suggestion by erickson:
public class FileIO {
public final static String EOL = "\n";
public static final String AES_ALGORITHM = "AES/CTR/NoPadding";
public static final String PROVIDER = "BC";
private static final byte[] AES_KEY_128 = { // Hard coded for now
78, -90, 42, 70, -5, 20, -114, 103,
-99, -25, 76, 95, -85, 94, 57, 54};
private static final byte[] IV = { // Hard coded for now
-85, -67, -5, 88, 28, 49, 49, 85,
114, 83, -40, 119, -65, 91, 76, 108};
private static final SecretKeySpec secretKeySpec =
new SecretKeySpec(AES_KEY_128, "AES");
private static final IvParameterSpec ivSpec =
new IvParameterSpec(IV);
public String readAesFile(Context c, String fileName) {
StringBuilder stringBuilder = new StringBuilder();
try {
InputStream is = c.openFileInput(fileName);
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
CipherInputStream cis = new CipherInputStream(is, cipher);
InputStreamReader isr = new InputStreamReader(cis);
BufferedReader reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append(EOL);
}
is.close();
} catch (java.io.FileNotFoundException e) {
// OK, file probably not created yet
Log.i(this.getClass().toString(), e.getMessage(), e);
} catch (Exception e) {
Log.e(this.getClass().toString(), e.getMessage(), e);
}
return stringBuilder.toString();
}
public void writeAesFile(Context c, String fileName, String theFile) {
try {
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
byte[] encrypted = cipher.doFinal(theFile.getBytes());
OutputStream os = c.openFileOutput(fileName, 0);
os.write(encrypted);
os.flush();
os.close();
} catch (Exception e) {
Log.e(this.getClass().toString(), e.getMessage(), e);
}
}
}
Full code isn't shown, but it looks like you are writing hex-encoded text into the file, but reading it without decoding back to bytes. Skip the hex encoding (I assume that was to help you debug).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With