您有两种方法来加密/解密位图。
解决方案1
使用提供的流加密文件。根本不需要使用 Base64 编码/解码。
Encrypt:
private void encrypt(final Context context, final File target, final Bitmap bitmap) throws GeneralSecurityException, IOException {
final MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
final EncryptedFile file = new EncryptedFile.Builder(context,
target, mainKey, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB)
.build();
final OutputStream stream = file.openFileOutput();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
stream.flush();
stream.close();
}
Decrypt:
private Bitmap decrypt(final Context context, final File target) throws GeneralSecurityException, IOException {
final MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
final EncryptedFile file = new EncryptedFile.Builder(context,
target, mainKey, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB)
.build();
final InputStream stream = file.openFileInput();
return BitmapFactory.decodeStream(stream);
}
解决方案2
- 加密之前,将位图字节编码为 base64。
- 解密后,从base64解码在转换回位图之前.
对于您的特定代码示例,请执行以下操作:
private byte[] bitmapToByteArray(final Bitmap bitmap) {
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
final String data = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
return data.getBytes();
}
private Bitmap byteArrayToBitmap(final byte[] bytes) {
final byte[] data = Base64.decode(bytes, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(data, 0, data.length);
}