tags:

views:

68

answers:

1

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);
        }
    }
}
+1  A: 

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).

erickson
That was it. Thanks a million. I seperated the cipher file IO functions to a new class to help with my confusion. I post the working code as an edit to my original question.
JackN