HarmonyOS AES加密算法demo?

其他系统实现方法:

public static String encryptAES(String data, String key, String iv)  {
  try {
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    int blockSize = cipher.getBlockSize();
    byte[] dataBytes = data.getBytes();
    int plaintextLength = dataBytes.length;

    if (plaintextLength % blockSize != 0) {
      plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
    }

    byte[] plaintext = new byte[plaintextLength];
    System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

    SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
    IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());  // CBC模式,需要一个向量iv,可增加加密算法的强度

    cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

    return Base64Util.encodeBytes(cipher.doFinal(plaintext));

  } catch (Throwable e) {
    ShareAlcLogUtil.handOffDebugLog("AMapCarHandoffAESUtil","encryptAES " + Log.getStackTraceString(e));
    return "";
  }
}
阅读 601
1 个回答

参考demo:

const base64 = new util.Base64Helper();
const textEncoder = new util.TextEncoder();
let key = "LRGg4aDNkG4tDkD=";
let vi = "BpLsJEYGIlvi9DLJ";

function encryptByAES(data: string): string {
  try {
    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
    let symKey = aesGenerator.convertKeySync({ data: textEncoder.encodeInto(key) });
    let ivspec: cryptoFramework.IvParamsSpec = {
      algName: "IvParamsSpec", // CBC模式
      iv: { data: textEncoder.encodeInto(vi) }
    };
    let cipher = cryptoFramework.createCipher('AES|CBC|NoPadding');
    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivspec);
    let plainText: cryptoFramework.DataBlob = { data: textEncoder.encodeInto(data) };
    return base64.encodeToStringSync(cipher.doFinalSync(plainText).data);
  } catch (e) {
    console.log('encrypt with error code ' + e.code)
    console.log('encrypt with error message ' + e.message)
    return "";
  }
}

function encryptByAESWithNoPadding(data: string): string {
  try {
    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
    let symKey = aesGenerator.convertKeySync({ data: textEncoder.encodeInto(key) });
    let ivspec: cryptoFramework.IvParamsSpec = {
      algName: "IvParamsSpec", // CBC模式
      iv: { data: textEncoder.encodeInto(vi) }
    };
    let cipher = cryptoFramework.createCipher('AES|CBC|NoPadding');
    // let cipher = cryptoFramework.createCipher('AES|CBC|PKCS5');
    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivspec);

    let blockSize: number = 16; // AES为分组加密算法,分组长度为128位,最后一组明文可能不足128位(16字节),此时可以通过不同的填充模式进行数据填充,如果是NoPadding需要手动补全
    let dataBytes = textEncoder.encodeInto(data);
    let plaintextLength = dataBytes.length;
    if (plaintextLength % blockSize != 0) { // 如果使用PKCS5补全模式,不需要if语句判断补全
      plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
    }
    let plaintext = new Uint8Array(plaintextLength);
    plaintext.set(dataBytes);

    let plainTextBlob: cryptoFramework.DataBlob = { data: plaintext };
    let result = cipher.doFinalSync(plainTextBlob).data;
    return base64.encodeToStringSync(result);
  } catch (e) {
    return "";
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进