Android 使用facebooks隐藏库解密文件

Android 使用facebooks隐藏库解密文件,android,facebook,encryption,io,Android,Facebook,Encryption,Io,我正在尝试使用隐藏facebook库来加密和解密一些音频文件。 因此,加密阶段没有问题,但随后的解密阶段总是以以下错误结束: com.facebook.crypto.cipher.NativeGCMCipherException: decryptFinal at com.facebook.crypto.cipher.NativeGCMCipher.decryptFinal(NativeGCMCipher.java:108) at com.facebook.crypto.streams

我正在尝试使用隐藏facebook库来加密和解密一些音频文件。 因此,加密阶段没有问题,但随后的解密阶段总是以以下错误结束:

com.facebook.crypto.cipher.NativeGCMCipherException: decryptFinal
   at com.facebook.crypto.cipher.NativeGCMCipher.decryptFinal(NativeGCMCipher.java:108)
   at com.facebook.crypto.streams.NativeGCMCipherInputStream.ensureTagValid(NativeGCMCipherInputStream.java:126)
   at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:91)
   at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:76)
这是我的代码:

public类主扩展活动{
专用按钮btnEncrypt、btndecypt、btnPlay、btnStop;
私有最终字符串mediaPath=Environment.getExternalStorageDirectory().getPath();
私有文件;
私有字符串媒体;
私人国家图书馆;
私有密码;
私钥链;
私营实体;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnEncrypt=(按钮)findviewbyd(R.id.btnEncrypt);
btnDecrypt=(按钮)findViewById(R.id.btnDecrypt);
mNativeCryptoLibrary=新系统NativeCryptoLibrary();
键=新的钥匙链();
crypto=新密码(密钥,mNativeCryptoLibrary);
如果(!crypto.isAvailable()){
Log.e(“错误:,“加密不可用!”);
回来
}
media=mediaPath+“/example.mp3”;
文件=新文件(媒体);
实体=新实体(“测试”);
如果(savedInstanceState==null){
getFragmentManager().beginTransaction()
.add(R.id.container,新的占位符片段()).commit();
}
btnEncrypt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
OutputStream文件流,OutputStream;
试一试{
最终字节[]加密=新字节[(int)file.length()];
fileStream=new BufferedOutputStream(new FileOutputStream(media));
//加密
outputStream=crypto.getCipherOutputStream(文件流,实体);
outputStream.write(加密);
outputStream.close();
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(加密初始化异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(keychaine异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
btnDecrypt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
FileInputStream文件流;
输出流输出;
试一试{
fileStream=新文件输入流(媒体);
InputStream InputStream=crypto.getCipherInputStream(文件流,实体);
out=newfileoutputstream(Environment.getExternalStorageDirectory().getPath()+“/decrypt.mp3”);
int-read;
字节[]缓冲区=新字节[1024];
而((读取=输入流。读取(缓冲区))!=-1){
输出。写入(缓冲区,0,读取);
}
inputStream.close();
out.close();
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(加密初始化异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(keychaine异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/**
*包含简单视图的占位符片段。
*/
公共静态类占位符片段扩展了片段{
公共占位符片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,
假);
返回rootView;
}
}
}

我找到了这篇文章,但我仍然无法解决我的问题。

如果mac不匹配,DecryptFinal将失败。我认为问题可能是因为每次调用onCreate时都在重新创建crypto对象和密钥链。这将导致密钥重置,因此无法解密您刚才加密的文件。重新创建“活动”时是否出现错误,或按下“解密”按钮时是否出现错误?否,即使在未退出“活动”的情况下运行文件的首次加密和解密后,也会出现问题,因此会重新创建该文件。出现的唯一错误是上面写的错误。