2010-09-09 51 views
3

爲了保持簡單,我現在使用硬編碼密鑰和IV。 AesWriter(如下)將原始明文Abc\t1234\t\t\t\t\n加密並寫入文件11,87,-74,122,-127,48,-118,39,82,-83,68,-30,-84。 但AesReader(也在下面)一致地解密文件的內容爲zW?D?4?rc?~???~?_=p?J。任何想法,我錯了?由埃裏克森根據建議爲什麼AES/CTR/NoPadding被破壞?

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(); 
    } 

工作代碼:

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); 
     } 
    } 
} 

回答

3

完整的代碼沒有顯示,但它看起來像你寫的十六進制編碼文本文件,但閱讀它無需解碼回到字節。跳過十六進制編碼(我認爲這是爲了幫助您調試)。

+0

就是這樣。太感謝了。我將密碼文件IO功能分爲一個新類,以幫助我解決困惑。我將工作代碼發佈爲我的原始問題的編輯。 – jacknad 2010-09-10 12:38:43

相關問題