我正在尝试使用 Facebook Conceal Library 加密和解密图像。这是我第一次使用它,因此如果它微不足道,请耐心等待。我查看了有关 SO 的其他问题,以找出异常的原因,但我无法使其正常工作。
这是我到目前为止所做的......
集成:我使用的是 Eclipse,因此从以下位置下载了 crypto.jar 和 libs.ziphere并将 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();
}
}
位图转字节():
private byte[] bitmapToBytes(Bitmap photo) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
解码文件():
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;
}
字节转位图():
private Bitmap bytesToBitmap(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
}
当我尝试保存图像时,我收到 UnsupportedOperationExceptionobjectOutputStream.close();
在保存文件()中
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
感谢您的帮助...