2010-09-09 4 views
3

Pour simplifier, j'utilise une clé codée en dur et IV pour le moment. AesWriter (ci-dessous) crypte et écrit le texte en clair d'origine, Abc\t1234\t\t\t\t\n, dans un fichier sous la forme 11,87,-74,122,-127,48,-118,39,82,-83,68,-30,-84. Mais AesReader (également ci-dessous) décrypte le contenu du fichier de manière cohérente en tant que zW?D?4?rc?~???~?_=p?J. Des idées où je me trompe?Pourquoi AES/CTR/NoPadding est-il cassé?

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

Code de travail basé sur la suggestion par 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); 
     } 
    } 
} 

Répondre

3

code complet n'apparaît pas, mais il semble que vous rédigez un texte hexadécimal codé dans le fichier, mais la lecture sans décodage arrière aux octets. Passer l'encodage hexadécimal (je suppose que c'était pour vous aider à déboguer).

+0

C'était tout. Merci un million. J'ai séparé les fonctions IO du fichier chiffré à une nouvelle classe pour aider à ma confusion. Je poste le code de travail en tant que modification de ma question initiale. – jacknad