【问题标题】:Facebook Conceal - Image Encryption and DecryptionFacebook Conceal - 图片加解密
【发布时间】:2014-10-07 18:26:49
【问题描述】:

我正在尝试使用 Facebook 隐藏库加密和解密图像。这是我第一次使用它,因此如果它微不足道,请耐心等待。我查看了关于 SO 的其他问题,以找出我的异常的原因,我无法让它工作。

这是我到目前为止所做的......

集成:我使用的是 Eclipse,因此,从 here 下载了 crypto.jar 和 libs.zip,并将 jar 文件添加到 libs 文件夹,并将 .so 文件添加到 libs 文件夹内的相应文件夹中。

我的场景:

我必须从相机捕捉图像,加密并将其存储在我的手机内存中。解密它并在图像视图中显示它。在稍后阶段,我还需要从内存中解密这张图片并通过网络发送。

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

@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 {

        }

    }
}

保存文件():

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

感谢您的帮助...

【问题讨论】:

  • OutputStream outputStream = crypto.getCipherOutputStream(fileStream, new Entity("Password")); ..这是正确的做法。我认为最后一个参数Entity是一个密码。所以,为了测试,我使用“密码”
  • 不支持的操作异常可能只是指向使用了错误的运行时级别。

标签: android facebook encryption


【解决方案1】:

这是我解决问题的方法。加密和解密现在可以正常工作了。

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

这是我在从相机返回后在 onActivityResult() 中调用 encodeAndSaveFile() 和 decodeFile() 的方式。

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

【讨论】:

  • ,这个异常的原因是什么,请您详细说明一下。
  • 我仍在按照字节解密,仍然出现此错误。这里的问答代码可能有所不同。
  • 这是一个纯代码的答案,因此这在任何方面都没有建设性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多