2014-10-01 20 views
5

Facebook Gizleme Kütüphanesi'ni kullanarak görüntüyü şifrelemeye ve şifresini çözmeye çalışıyorum. Bu, ilk kez kullanıyorum ve dolayısıyla önemsiz ise benimle birlikte. İstisnalarımın nedenlerini anlamak için SO ile ilgili diğer sorulara baktım, çalışamadım. here gelen crypto.jar ve libs.zip indirilen Eclipse kullanıyorum ve dolayısıyla am ve klasör ve .bu dosyaları libs için kavanoz dosyası ekledi: Burada Facebook Gizil - Görüntü Şifreleme ve Şifre Çözme

entegre ediliyor ... Bugüne dek yapmış budur libs klasörünün içindeki ilgili klasöre.

Benim senaryo:

Ben kamera, şifreleme bir görüntüyü yakalamak ve benim telefon belleğine kaydetmenize gerek. Şifresini çöz ve bir resim gösterisinde göster. Daha sonraki bir aşamada, bu görüntüyü bellekten deşifre etmeli ve ağ üzerinden göndermem gerek.

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():

Yani, benim kod

@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 (...) aşağıda gider

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(): i görüntüyü kaydetmeye çalıştığınızda

private Bitmap bytesToBitmap(byte[] bytes) { 

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

i saveFile içinde objectOutputStream.close(); bir UnsupportedOperationException olsun()

Logcat İz: Yardımlarınız için

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 

teşekkürler. ..

+0

OutputStream OutputStream = crypto.getCipherOutputStream ( FileStream, yeni Varlık ("Parola")); .. bunu yapmanın doğru yolu budur. Son parametre olan Entity'nin bir şifre olduğunu düşünüyorum. Yani, test için, "Şifre" –

cevap

3

İşte ben bu sorunu nasıl çözdüm .. şifreleme ve şifre çözme şimdi iyi çalışıyor. i kameradan döndükten sonra, onActivityResult içinde encodeAndSaveFile() ve decodeFile(),() arıyorum nasıl İşte

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

olduğunu.

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

kullanıyorum, bu istisnanın sebebi neydi, bu konuda ayrıntılı olabilir misiniz. – SimpleCoder

+0

Neredeyse yarım buçuk arka arkadaşımdı! Şimdi hatırlayamıyorum .. –

+0

Hala byte bilge şifre çözme takip ediyorum, hala bu hatayı alıyorum. Soru kodundaki olası fark ve burada cevap. – SimpleCoder

İlgili konular