4

Hi, I am using jetpack security encryption library for encrypting the file. I have generate Master Key with below code.

  MasterKey masterKey = null;
         try {
            masterKey = new
                     MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
                     .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
                     .build();
         } catch (GeneralSecurityException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }

I have encrypted my text file Sample.txt and write encrypted file to device external storage. The code as given below.

   InputStream inputStream = new BufferedInputStream(appCtx.getAssets().open("Sample.txt"));
             byte[] fileBytes=new byte[inputStream.available()];
             inputStream.read(fileBytes);
             File file = new File(Environment.getExternalStorageDirectory(), "Sample.txt");
             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                 EncryptedFile encryptedFile = new EncryptedFile.Builder(
                         appCtx,
                         file,
                         masterKey,
                         EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
                 ).build();
                 OutputStream outputStream = encryptedFile.openFileOutput();
                 outputStream.write(fileBytes);
                 outputStream.flush();
                 outputStream.close();

I put encrypted file in asset folder and now trying to decrypt but as per documentation EncryptedFile.Builder always have file Object as parameter and currently i have Inputstream after reading file from asset. So, to get file object i am writing this Inutstream to external storage as Temp.txt and passing this file for decryption. But I am getting exception as java.io.IOException: No matching key found for the ciphertext in the stream.

The code for decryption as follows:

   InputStream myInputstream = new BufferedInputStream(appCtx.getAssets().open("Sample.txt"));
             File enfile = createFileFromInputStream(myInputstream,appCtx);
             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                 EncryptedFile encryptedFile = new EncryptedFile.Builder(
                         appCtx,
                         enfile,
                         masterKey,
                         EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
                 ).build();
                 InputStream inputStream1 = encryptedFile.openFileInput();
       BufferedOutputStream os1 = new BufferedOutputStream( new FileOutputStream(new File(dstPath)));
                 int length = 0;
                 byte[] buffer = new  byte[1024];
                 while ((length = inputStream1.read(buffer)) != -1) {
                     os1.write(buffer, 0, length);
                 }
                 os1.close();
             }

     private static File createFileFromInputStream(InputStream stream, Context context) {
             File f = new File(Environment.getExternalStorageDirectory(), "Temp.txt");
             BufferedOutputStream os1 = null;
             try {
                 os1 = new BufferedOutputStream( new FileOutputStream(f));
                 int length = 0;
                 byte[] buffer = new  byte[1024];
                 while ((length = stream.read(buffer)) != -1) {
                     os1.write(buffer, 0, length);
                 }
                 os1.close();
                 stream.close();
                 return f;
         } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }catch (IOException e) {
                 //Logging exception
             }
 
         return null;
     }

Main Scenario: If write encrypted file to external storage and read it for decryption directly from external storage, then everything is working file. But If i paste encrypted file in asset folder and write Inputstream getting from asset folder to some temporary file and then try to decrypt it is giving error java.io.IOException: No matching key found for the ciphertext in the stream.

Please anyone help me with this issue. Thanks

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62

1 Answers1

1

This is android-crypto library internal implementation problem. Try to update to latest version, this helped me.

daxh
  • 571
  • 7
  • 14