正在解密在Android上使用EncryptedFile加密的文件

问题描述 投票:1回答:2

我正在加密通过蓝牙服务在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实例。

我将不胜感激!

谢谢,迈克尔

android file encryption androidx tink
2个回答
0
投票

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

返回下一个调用此输入流方法可从此输入流读取(或跳过)的剩余字节数的estimate 无阻塞

对于同一系统上的文件,从某种意义上说,这始终是“剩余”到文件末尾的字节数。但是,对于其他流,available主要提示您应请求多少个字节。对于解密,available()可以简单地返回解密后已经可用的字节数。可能是密文仅应要求解密,因此返回0。


对于特定密码,由于纯文本需要unpadding(ECB / CBC)或authentication tag]的验证和删除,因此确定流的末尾是否还很困难。 。这可能会使available的计算复杂化。 API实现可能只是决定总是简单地返回0(这意味着对read may always block的调用)。


0
投票

我创建了提到的类,以使用AES执行文件加密和解密,下面是代码。我已将文件转换为字节数组并对其执行加密,然后再次使用file对其解密并从函数中返回字节。

© www.soinside.com 2019 - 2024. All rights reserved.