首页 > 解决方案 > 在 Android 上解密使用 EncryptedFile 加密的文件时出现问题

问题描述

我正在加密在蓝牙服务中的 android 应用程序上创建的文件。稍后在另一堂课中,我想解密此文件并将其上传到服务器。

对于加密,我使用的是 AndroidX androidx.security:security-crypto:1.0.0-alpha02 库,它是 Tink 的包装器。我已经阅读了所有可以找到的有关 EncryptedFile、EncryptedFile.Builder 等的开发人员文档和教程。

我加密文件如下:

String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";

EncryptedFile m_StudyChannelEncryptedFile = new EncryptedFile.Builder(
    filePath,
    getApplicationContext(),
    masterKeyAlias,
   EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
m_output = m_StudyChannelEncryptedFile.openFileOutput();

从这里我可以像普通的 FileOutputStream 一样写入文件,通过查看写入手机存储的数据,我可以确认它是加密的。

在上传之前,我尝试在另一个类中做同样的事情,然后解密它。

String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";

EncryptedFile encryptedFile = new EncryptedFile.Builder(
  filePath,
  getApplicationContext(),
  masterKeyAlias,
  EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
// Read channel data file  
FileInputStream fChannel = encryptedFile.openFileInput();
m_Dat1Size = fChannel.available();

从这里开始,问题是我得到的文件的可用大小为零 - 就像它不存在一样。我可以确认写入的原始数据没有被覆盖,因为手机存储上的文件仍然有加密数据。

我相信,通过为其提供位置 keySetAlias、keySetPref,EncryptedFile 构建器应该能够初始化一个具有正确密钥的 EncryptedFile 实例。

我将不胜感激任何帮助或见解!

谢谢你,迈克尔

标签: androidfileencryptionandroidxtink

解决方案


例如,不能依靠InputStream返回值来返回可以读取的字节总数:available

返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

对于同一系统上的文件,这总是“剩余”到文件末尾的字节数是有道理的。但是,对于其他流available,主要是关于您应该请求多少字节的提示。对于解密,available()可以简单地返回解密后已经可用的字节数。很可能密文仅在请求时才被解密,因此它返回 0。


对于特定密码,由于明文需要取消填充(ECB/CBC) 或验证和删除身份验证标签(GCM) ,确定是否到达流的末尾也可能很棘手。这可能会使 的计算复杂化available。API 实现可能只是决定简单地返回0always(这意味着调用read 可能总是阻塞)。


推荐阅读