2014-10-01 15 views
5

Próbuję szyfrować i odszyfrowywać obraz przy użyciu Facebook Conceal Library. Po raz pierwszy używam go i dlatego noszę ze mną, jeśli to jest trywialne. Przyjrzałem się innym pytaniom na temat SO, aby znaleźć powody moich wyjątków, nie mogłem sprawić, żeby działało.Facebook Conceal - Szyfrowanie i odszyfrowywanie obrazu

Oto co zrobiłem do tej pory ...

Integracja: Używam Eclipse i stąd pobrać crypto.jar i libs.zip z here i dodaje plik jar do folderu libs i pliki .so do odpowiedniego folderu wewnątrz folderu libs.

Mój scenariusz:

mam do przechwytywania obrazu z kamery, szyfrowania i przechowywać go w mojej pamięci telefonu. Odszyfruj go i pokaż w widoku obrazu. Na późniejszym etapie muszę również odszyfrować ten obraz z pamięci i wysłać go przez sieć.

Więc mój kod idzie jak poniżej ...

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (Const.DEBUGGING) { 
     Log.d(Const.DEBUG, "RequestCode: " + requestCode + "\nResultCode:" 
       + resultCode); 
    } 

    int tag = getRecordCount(); 
    tag++; 

    if (requestCode == KTP_PICTURE_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 

      ENCRYPTEDFILENAME = tag + "_" + KTP_TAG + ".png"; 

      saveFile((Bitmap) data.getExtras().get("data"), requestCode); 
      Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME); 
      mImgBtnKtppicture.setImageBitmap(decryptedImage); 

     } else if (resultCode == RESULT_CANCELED) { 
      if (Const.DEBUGGING) 
       Log.d(Const.DEBUG, "KTP_RESULT CANCELED"); 
     } else { 

     } 
    } 

    if (requestCode == PROFILE_PICTURE_REQUEST_CODE) { 

     if (resultCode == RESULT_OK) { 

      ENCRYPTEDFILENAME = tag + "_" + PROFILE_TAG + ".png"; 

      saveFile((Bitmap) data.getExtras().get("data"), requestCode); 
      Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME); 
      mImgBtnPicture.setImageBitmap(decryptedImage); 

     } else if (resultCode == RESULT_CANCELED) { 
      if (Const.DEBUGGING) 
       Log.d(Const.DEBUG, "PICTURE_RESULT CANCELED"); 
     } else { 

     } 

    } 
} 

savefile():

public void saveFile(Bitmap photo, int code) { 

    try { 
     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE); 
     File mypath = new File(directory, ENCRYPTEDFILENAME); 

     if (code == KTP_PICTURE_REQUEST_CODE) { 
      mKtppicture = Uri.fromFile(mypath).toString(); 

      if (Const.DEBUGGING) 
       Log.d(Const.DEBUG, "KTP Picture Path: " + mKtppicture); 
     } else if (code == PROFILE_PICTURE_REQUEST_CODE) { 
      mPicture = Uri.fromFile(mypath).toString(); 

      if (Const.DEBUGGING) 
       Log.d(Const.DEBUG, "Profile Picture Path: " + mPicture); 
     } 


     Crypto crypto = new Crypto(
        new SharedPrefsBackedKeyChain(this), 
        new SystemNativeCryptoLibrary()); 


     if (!crypto.isAvailable()) { 
       return; 
      } 

     OutputStream fileStream = new BufferedOutputStream(
        new FileOutputStream(mypath)); 

     OutputStream outputStream = crypto.getCipherOutputStream(
        fileStream, new Entity("Password")); 

     ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); 
     objectOutputStream.write(bitmapToBytes(photo)); 

     objectOutputStream.close(); //Line with exception 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

bitmapToBytes():

private byte[] bitmapToBytes(Bitmap photo) { 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    photo.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 

    return byteArray; 
} 

decodeFile():

private Bitmap decodeFile(String filename) { 

    Crypto crypto = new Crypto(
       new SharedPrefsBackedKeyChain(this), 
       new SystemNativeCryptoLibrary()); 

    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
    File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE); 
    File file = new File(directory, filename); 

    try{ 
     FileInputStream fileStream = new FileInputStream(file); 
     InputStream inputStream = crypto.getCipherInputStream(
        fileStream, 
        new Entity("Password")); 
     ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); 
     Bitmap bitmap = bytesToBitmap((byte[])objectInputStream.readObject()); 

     return bitmap; 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

bytesToBitmap():

private Bitmap bytesToBitmap(byte[] bytes) { 

    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    return bitmap; 
} 

Gdy próbuję zapisać obraz, dostaję UnsupportedOperationException na objectOutputStream.close(); w savefile()

Logcat Ślad:

10-01 16:55:34.529: W/System.err(31291): java.lang.UnsupportedOperationException 
10-01 16:55:34.529: W/System.err(31291): at com.facebook.crypto.streams.NativeGCMCipherOutputStream.write(NativeGCMCipherOutputStream.java:93) 
10-01 16:55:34.529: W/System.err(31291): at java.io.DataOutputStream.writeByte(DataOutputStream.java:144) 
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.drain(ObjectOutputStream.java:394) 
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:461) 
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.close(ObjectOutputStream.java:337) 
10-01 16:55:34.529: W/System.err(31291): at com.xx.xxx.RegistrationActivity.saveFile(RegistrationActivity.java:761) 
10-01 16:55:34.529: W/System.err(31291): at com.xx.xxx.RegistrationActivity.onActivityResult(RegistrationActivity.java:639) 
10-01 16:55:34.529: W/System.err(31291): at android.app.Activity.dispatchActivityResult(Activity.java:5423) 
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.deliverResults(ActivityThread.java:3347) 
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394) 
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.access$1300(ActivityThread.java:135) 
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
10-01 16:55:34.529: W/System.err(31291): at android.os.Handler.dispatchMessage(Handler.java:102) 
10-01 16:55:34.529: W/System.err(31291): at android.os.Looper.loop(Looper.java:136) 
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.main(ActivityThread.java:5001) 
10-01 16:55:34.529: W/System.err(31291): at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 16:55:34.529: W/System.err(31291): at java.lang.reflect.Method.invoke(Method.java:515) 
10-01 16:55:34.529: W/System.err(31291): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
10-01 16:55:34.529: W/System.err(31291): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
10-01 16:55:34.529: W/System.err(31291): at dalvik.system.NativeStart.main(Native Method) 
10-01 16:55:34.529: W/System.err(31291): java.io.IOException: Unexpected crypto version -1 
10-01 16:55:34.529: W/System.err(31291): at com.facebook.crypto.util.Assertions.checkArgumentForIO(Assertions.java:29) 
10-01 16:55:34.539: W/System.err(31291): at com.facebook.crypto.CipherHelper.getCipherInputStream(CipherHelper.java:52) 
10-01 16:55:34.539: W/System.err(31291): at com.facebook.crypto.Crypto.getCipherInputStream(Crypto.java:83) 
10-01 16:55:34.539: W/System.err(31291): at com.xx.xxx.RegistrationActivity.decodeFile(RegistrationActivity.java:821) 
10-01 16:55:34.539: W/System.err(31291): at com.xx.xxx.RegistrationActivity.onActivityResult(RegistrationActivity.java:640) 
10-01 16:55:34.539: W/System.err(31291): at android.app.Activity.dispatchActivityResult(Activity.java:5423) 
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.deliverResults(ActivityThread.java:3347) 
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394) 
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.access$1300(ActivityThread.java:135) 
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
10-01 16:55:34.539: W/System.err(31291): at android.os.Handler.dispatchMessage(Handler.java:102) 
10-01 16:55:34.539: W/System.err(31291): at android.os.Looper.loop(Looper.java:136) 
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.main(ActivityThread.java:5001) 
10-01 16:55:34.539: W/System.err(31291): at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 16:55:34.539: W/System.err(31291): at java.lang.reflect.Method.invoke(Method.java:515) 
10-01 16:55:34.539: W/System.err(31291): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
10-01 16:55:34.549: W/System.err(31291): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
10-01 16:55:34.549: W/System.err(31291): at dalvik.system.NativeStart.main(Native Method) 
10-01 16:55:34.549: D/BAT(31291): onResume called 

Dzięki za pomoc. ..

+0

OutputStream OutputStream = crypto.getCipherOutputStream ( Filestream, nowe jednostki ("hasło")); .. jest to właściwy sposób robienia tego. Myślę, że ostatni parametr, Entity, jest szyfrem. Tak więc do testowania używam "Hasła" –

Odpowiedz

3

Oto jak rozwiązałem problem. Szyfrowanie i odszyfrowywanie działają teraz dobrze.

// Encrypts the image and saves to directory 

public void encodeAndSaveFile(Bitmap photo, int code) { 

    try { 
     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE); 
     File mypath = new File(directory, ENCRYPTEDFILENAME); 

     Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this), 
       new SystemNativeCryptoLibrary()); 

     if (!crypto.isAvailable()) { 
      return; 
     } 

     OutputStream fileStream = new BufferedOutputStream(
       new FileOutputStream(mypath)); 
     OutputStream outputStream = crypto.getCipherOutputStream(
       fileStream, new Entity("Password")); 
     outputStream.write(bitmapToBytes(photo)); 
     outputStream.close(); 
    } catch (UnsupportedOperationException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

// convert Bitmap to bytes 
private byte[] bitmapToBytes(Bitmap photo) { 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    photo.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 
    return byteArray; 
} 

// convert bytes to Bitmap 
private Bitmap bytesToBitmap(byte[] bytes) { 

    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

    return bitmap; 
} 

// decode encrypted file and returns Bitmap 
private Bitmap decodeFile(String filename) { 

    Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this), 
      new SystemNativeCryptoLibrary()); 

    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
    File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE); 
    File file = new File(directory, filename); 

    try { 
     FileInputStream fileStream = new FileInputStream(file); 
     InputStream inputStream = crypto.getCipherInputStream(fileStream, 
       new Entity("Password")); 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 

     int read; 
     byte[] buffer = new byte[1024]; 

     while ((read = inputStream.read(buffer)) != -1) { 
      out.write(buffer, 0, read); 
     } 

     inputStream.close(); 

     Bitmap bitmap = bytesToBitmap(out.toByteArray()); 
     return bitmap; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

Oto jak Wołam encodeAndSaveFile() i decodeFile(), w onActivityResult(), po powrocie z aparatem.

encodeAndSaveFile((Bitmap) data.getExtras().get("data"), 
         requestCode); 
Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME); 
+0

, co było przyczyną tego wyjątku, czy mógłbyś to wyjaśnić. – SimpleCoder

+0

To był prawie jeden i pół roku z powrotem kumpel !! Nie pamiętam tego teraz .. –

+0

Nadal śledzę proces bajtowego odszyfrowywania, ciągle otrzymuję ten błąd. Różnica w kodzie pytania i odpowiedzi tutaj. – SimpleCoder

Powiązane problemy