2014-10-01 99 views
5

我试图使用Facebook隐藏库加密和解密图像。这是我第一次使用它,因此如果它是微不足道的,我就会忍受。我已经看过其他的问题来找出我的例外的原因,我不能得到它的工作。Facebook隐藏 - 图像加密和解密

这里是我做了什么至今...

整合:我使用Eclipse,因此,下载crypto.jar和libs.zip从here并添加jar文件到libs文件夹和.so文件到libs文件夹内的各个文件夹。

我的情景:

我要捕捉摄像头,加密的图像,并将其存储在我的手机内存。解密它并在imageview中显示它。在稍后阶段,我还需要从内存中解密此图像并通过网络发送。

所以,我的代码放在如下...

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

当我尝试保存图像,我在saveFile的在objectOutputStream.close();得到一个UnsupportedOperationException异常()

logcat的跟踪:

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 

感谢您的帮助。 ..

+0

的OutputStream的OutputStream = crypto.getCipherOutputStream( FILESTREAM,新的实体( “密码”)); ..是这样做的正确方法。我认为最后一个参数Entity是密码。所以,为了测试,我使用“密码” – 2014-10-01 11:34:57

回答

3

下面是我如何解决这个问题..现在加密和解密工作正常。

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

这里是我如何打电话encodeAndSaveFile()和decodeFile(),在onActivityResult(),从相机返回后。

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

,这个例外的原因是什么,请您详细说明一下。 – SimpleCoder 2016-02-04 11:09:27

+0

这差不多有一年半的时间了!现在不记得了.. – 2016-02-04 11:12:26

+0

我仍然继续字节解密,仍然得到这个错误。这里的问题和答案的代码可能不同。 – SimpleCoder 2016-02-04 11:14:18