HarmonyOS 加解密兼容问题?

目前的解密逻辑如下:

export async function _decryptChapterContent(decryptKey: string, cpContent: string): Promise<string> {
  try {
    let key = new Uint8Array(buffer.from(decryptKey, 'utf-8').buffer)
    let base64 = new util.Base64Helper
    const cryptKeyData = base64.decodeSync(key).subarray(0, 16)
    const data = new Uint8Array(buffer.from(cpContent, 'base64').buffer)
    const nonce = copyOfRange(data, 0, 16)
    const content = copyOfRange(data, 16, data.length)
    let encryptMess: cryptoFramework.DataBlob = { data: content };
    let ivBlob: cryptoFramework.DataBlob = { data: nonce };
    let ivParamsSpec: cryptoFramework.IvParamsSpec = {
      algName: "IvParamsSpec",
      iv: ivBlob
    };
    let symKeyBlob: cryptoFramework.DataBlob = { data: cryptKeyData };
    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
    let symKey = aesGenerator.convertKeySync(symKeyBlob);
    let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS5');
    decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, ivParamsSpec);
    let decryptUpdate = decoder.doFinalSync(encryptMess);
    let result = buffer.from(decryptUpdate.data).toString('utf-8')
    return result
  } catch (e) {
    return ""
  }
}

目前存在两组数据,其中A数据可以解密,B数据无法解密。

阅读 502
1 个回答

示例参考如下:

// Index.ets
import { buffer, util } from '@kit.ArkTS';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';

@Entry
@Component
struct Index {
  @State showAbility: string = 'showAbility'

  build() {
    Row() {
      Column() {
        Text(this.showAbility)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            let decryptKey = "3570xxxxb9620659";
            let cpContent = "xxxx";
            let key = new Uint8Array(buffer.from(decryptKey, 'utf-8').buffer)
            console.error("key  " + key)
            let base64 = new util.Base64Helper
            const cryptKeyData = base64.decodeSync(key).subarray(0, 24)
            console.error("cryptKeyData  " + cryptKeyData)
            const data = new Uint8Array(buffer.from(cpContent, 'base64').buffer)
            console.error(cryptKeyData.toString())
            let nonce = data.subarray(0, 16)
            let content = data.subarray(16, data.length)
            console.error("nonce " + nonce)
            console.error("content " + content)
            let encryptMess: cryptoFramework.DataBlob = { data: content };
            let ivBlob: cryptoFramework.DataBlob = { data: nonce };
            let ivParamsSpec: cryptoFramework.IvParamsSpec = {
              algName: "IvParamsSpec",
              iv: ivBlob
            };
            let symKeyBlob: cryptoFramework.DataBlob = { data: cryptKeyData };
            let aesGenerator = cryptoFramework.createSymKeyGenerator('AES192');
            let symKey = aesGenerator.convertKeySync(symKeyBlob);
            let decoder = cryptoFramework.createCipher('AES192|CBC|PKCS5');
            decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, ivParamsSpec);
            let decryptUpdate = decoder.doFinalSync(encryptMess);
            let result = buffer.from(decryptUpdate.data).toString('utf-8')
            console.error("    " + result)
          });
      }
      .width('100%')
    }
    .height('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进