HarmonyOS 开发中针对流形式文件(zip文件)AES解密,再zip解压?

HarmonyOS 开发中针对流形式文件(zip文件)AES解密,再zip解压?后端接口下发一个zip二进制文件,aes加密过的;然后在客户端需要用aes解密,然后再对zip解压。zip解压有api:ohos.zlib可以实现。请问针对aes加密的zip文件有方法可以解密吗?

阅读 633
avatarAI BotBETA

在HarmonyOS开发中,处理AES加密的zip文件并对其进行解密及解压,可以通过以下步骤实现:

  1. AES解密
    首先,你需要使用AES算法对接收到的加密zip文件进行解密。HarmonyOS支持Java或C/C++进行应用开发,因此你可以根据你的应用类型选择合适的语言实现AES解密。

    • Java示例(如果你使用的是Java API):
      你可以使用Java的Cipher类来解密数据。首先,你需要使用密钥(Key)和初始化向量(IV,如果使用了CBC模式)来初始化Cipher对象,并设置为解密模式(Cipher.DECRYPT_MODE)。然后,你可以使用doFinal()方法将加密的zip数据解密为字节流。
    • C/C++示例(如果你使用的是C/C++ API):
      你可能需要使用OpenSSL或其他加密库来执行AES解密。这些库通常提供函数或方法来设置密钥、加密模式(如CBC)和初始化向量,然后执行解密操作。
  2. ZIP解压
    解密后的数据是zip格式的字节流,你可以使用ohos.zlib提供的API来解压这些数据。ohos.zlib通常提供了如inflateInit2(), inflate(), inflateEnd()等函数来处理zip文件的解压。

    • 使用ohos.zlib时,你需要先初始化一个解压上下文(例如通过inflateInit2()),然后传入解密后的zip数据(注意,zip数据可能需要先去除任何zip文件头或尾,这取决于AES加密是如何处理的),最后使用inflate()函数进行解压,并在完成后调用inflateEnd()来释放资源。

注意

  • 确保你完全理解AES加密时使用的具体参数(如密钥大小、加密模式、填充模式、IV等),因为这些参数在解密时是必需的。
  • 如果zip文件在加密前没有去除任何zip特有的头部或尾部,你需要在解密后确保这些数据仍然保留,以便正确进行zip解压。
  • 考虑到性能和安全性,确保在处理加密和解密时遵循最佳实践,比如使用安全的密钥管理方式和加密模式。

以上步骤为你提供了一个基本的框架,你可以根据具体的项目需求和API文档进行实现。如果你使用的是第三方库或框架,请查阅相应的文档来获取更详细的实现指南。

1 个回答

可以将文件转为二进制数组传入加解密方法中可以进行加密和解密操作,具体代码参考:

/*加密*/ 
export async function aesEncrypt(text:Uint8Array,puKey:string): Promise<string>{ 
  let globalResult = "" 
  try { 
    let cipherAlgName = 'AES128|ECB|PKCS7'; 
    let globalCipher = cryptoFramework.createCipher(cipherAlgName); 
    let symAlgName = 'AES128'; 
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName); 
    let dataUint8Array = base.decodeSync(puKey) 
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array } 
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob) 
    await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, null); 
    let result = await globalCipher.doFinal({data:text}) 
    globalResult = base.encodeToStringSync(result.data); 
  } catch (err) { 
    console.log(err.message) 
  } 
  return globalResult; 
} 
 
// 解密 
export async function aesDecrypt(text: string, key: string) { 
  let globalResult = "" 
  try { 
    let cipherAlgName = 'AES128|ECB|PKCS7'; 
    let globalCipher = cryptoFramework.createCipher(cipherAlgName); 
    let symAlgName = 'AES128'; 
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName); 
    let dataUint8Array = base.decodeSync(key) 
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array } 
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob) 
    await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, null); 
    let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(text) } 
    let result = await globalCipher.doFinal(plainText)//解密结果 
  } catch (err) { 
    console.log(err.message) 
  } 
  return globalResult; 
}

对于加解密的规格和密钥规格可以参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
可以读取文件信息,获知文件大小size:
https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...
再自行按定长读取文件内容,分段AES解密
https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...

/** 
 * aes文件加密 
 */ 
function encryptFile(srcPath, outPath) { 
  return new Promise(resolve => { 
    try { 
      if (!srcPath || !outPath) { 
        return resolve({code: 0, message: '路径srcPath或outPath为空!'}); 
      } 
      /* 
      * outPath:'/Users/xxx/WorkSpace/zt-repository/offline-pack-platform/pack-server/uploads/online/encrypt/aeron/using.zip 
      * ///opt/cephfs_workspace/h5-offline/uploads/online/encrypt/commonRes/UahFgeGd/v10003 
      * 首先去除文件名再创建目录 
      * */ 
      let len = outPath.lastIndexOf('/'); 
      let outDir = outPath.substr(0, len); 
      fse.ensureDir(outDir, (err) => { 
        if (err) { 
          return resolve({code: 0, message: `创建目录${outDir}失败:${err.message}`}); 
        } 
 
        const keyVi = getCbcKeyVi(); 
        console.log('keyVi=', keyVi,srcPath,outPath); 
        const cipher = crypto.createCipheriv(__algorithm__, keyVi.key, keyVi.vi); 
        const rs = fs.createReadStream(srcPath); 
        const ws = fs.createWriteStream(outPath); 
        //console.log(111111,cipher) 
        rs.pipe(cipher) 
          .pipe(ws) 
          .on('error', function (err) { 
            console.log(`encryptFile err:${err.message}`); 
            return resolve({ 
              code: 0, 
              path: null, 
              msg: err && err.message 
            }); 
          }) 
          .on(`finish`, function () { 
            console.log(`encryptFile done!`); 
            return resolve({ 
              code: 1, 
              path: outPath 
            }); 
          }); 
      }); 
    } catch (err) { 
      return resolve({ 
        code: 0, 
        path: null, 
        msg: err.message 
      }); 
    } 
  }); 
} 
 
/** 
 * aes文件解密 
 */ 
function decryptFile(srcPath, outPath) { 
  const keyVi = getCbcKeyVi(); 
  //console.log('keyVi=', keyVi); 
 
  const deS = crypto.createCipheriv(__algorithm__, keyVi.key, keyVi.vi); 
  const rs = fs.createReadStream(srcPath); 
  const ws = fs.createWriteStream(outPath); 
 
  rs.pipe(deS) 
    .pipe(ws) 
    .on('error', function (err) { 
      console.log(`decryptFile err:${err.message}`)}

类似JS的原生方法如上所示可以参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题