HarmonyOS鸿蒙Next中如何解决AES算法加密程序崩溃

HarmonyOS鸿蒙Next中如何解决AES算法加密程序崩溃

问题现象

使用AES算法的CBC模式加密,执行doFinalSync程序崩溃。问题代码如下:

function tcpEncrypt(value: string, iv: string, key: string): Uint8Array {
  let cipher = cryptoFramework.createCipher('AES128|CBC|NoPadding');
  let siv = genIvParamsSpec(iv);
  let symKey = genSymKeyByData(StrUtil.strToUint8Array(key));
  cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, siv);
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(value, 'utf-8').buffer) };
  let cipherData = cipher.doFinalSync(plainText);
  return cipherData.data;
}

日志如下:

Pid:41288
Uid:20020022
Reason:Error
Error name:Error
Error message:do final fail!
Error code:
Stacktrace:
 at tcpEncrypt (entry/src/main/ets/utils/Aes.ets:116:20)
 at tcpEncryptData (entry/src/main/ets/utils/Aes.ets:14:10)
 at toBuffer (entry/src/main/ets/utils/SQHeaderEx.ets:81:33)
 at send (entry/src/main/ets/utils/TcpSocket.ets:96:20)
 at getTcpPublicKey (entry/src/main/ets/utils/CommonUtil.ets:60:5)
 at anonymous (entry/src/main/ets/utils/TcpSocket.ets:42:7)

背景知识

  • AES(Advanced Encryption Standard),最常见的对称加密算法。

    基本特点:分组密码算法,分组长度为128位;密钥长度为128位、192位或256位;与3DES相比,安全性更高,处理速度更快。

  • 3DES(Triple Data Encryption Algorithm),也称为3DESede或TripleDES。

    基本特点:使用3个64位的密钥对数据库进行三次加密,相当于对每个数据块执行三次DES(Data Encryption Standard)加密算法;与DES相比,3DES的密钥长度更长,安全性更高,但处理速度不如DES。

  • SM4,即SM4分组密码算法。

    基本特点:分组密码算法,分组长度为128位;密钥长度为128位。可通过扩展密钥增加密钥长度;加密算法与密钥扩展算法都采用32轮非线性迭代结构,数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

定位思路

检查加密算法的填充模式以及明文的长度。

解决方案

由于AES为分组加密算法,分组长度为128位。如果最后一组明文不足128位(16字节),可以通过不同的填充模式进行数据填充。

  • 问题代码中填充模式选择NoPadding,不会对明文进行填充,所以当最后一组不足128位时程序崩溃,可以选择PKCS5PKCS7进行填充。
  • 如果需要ZeroPadding,需要开发者手动对密文进行填充,密文填充的示例代码如下:
stringPadding(str: string) {
  let len = str.length
  switch (len % 16) {
    case 0:
      break;
    case 1:
      str.padEnd(16 - 1, '0');
      break;
    case 2:
      str.padEnd(16 - 2, '0');
      break;
    case 3:
      str.padEnd(16 - 3, '0');
      break;
    case 4:
      str.padEnd(16 - 4, '0');
      break;
    case 5:
      str.padEnd(16 - 5, '0');
      break;
    case 6:
      str.padEnd(16 - 6, '0');
      break;
    case 7:
      str.padEnd(16 - 7, '0');
      break;
    case 8:
      str.padEnd(16 - 8, '0');
      break;
    case 9:
      str.padEnd(16 - 9, '0');
      break;
    case 10:
      str.padEnd(16 - 10, '0');
      break;
    case 11:
      str.padEnd(16 - 11, '0');
      break;
    case 12:
      str.padEnd(16 - 12, '0');
      break;
    case 13:
      str.padEnd(16 - 13, '0');
      break;
    case 14:
      str.padEnd(16 - 14, '0');
      break;
    case 15:
      str.padEnd(16 - 15, '0');
      break;
  }
}

总结

  • 算法库当前提供了AES加解密常用的7种加密模式:ECB、CBC、OFB、CFB、CTR、GCM和CCM。由于AES为分组加密算法,分组长度为128位。如果最后一组明文可能不足128位(16字节),可以通过不同的填充模式进行数据填充。

    • ECB、CBC加密模式,明文长度不是128位整数倍,必须使用填充方法补足。
    • CCM加密模式,必须指定附加验证数据aad且其长度必须大于等于1字节且小于等于2048字节。
  • 3DES算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。算法库当前提供了3DES加解密常用的4种加密模式:ECB、CBC、OFB和CFB。由于DES为分组加密算法,分组长度为64位。在实际应用中,最后一组明文可能不足64位(8字节),此时可以通过不同的填充模式进行数据填充。

    • ECB、CBC加密模式,明文长度不是64位整数倍,必须使用填充方法补足。
  • 算法库当前提供了SM4加解密常用的7种加密模式:ECB、CBC、CTR、OFB、CFB、CFB128和GCM。由于SM4为分组加密算法,分组长度为128位。在实际应用中,最后一组明文可能不足128位(16字节),此时可以通过不同的填充模式进行数据填充。

    • ECB、CBC加密模式,明文长度不是128位整数倍,必须使用填充方法补足。

更多关于HarmonyOS鸿蒙Next中如何解决AES算法加密程序崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决AES算法加密程序崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,AES算法加密程序崩溃可能由以下原因导致:

  1. 密钥长度问题:AES算法支持128位、192位和256位密钥长度。如果密钥长度不符合要求,程序会崩溃。确保密钥长度正确。

  2. 数据块大小问题:AES加密要求数据块大小为128位。如果数据块大小不符合要求,程序会崩溃。确保数据块大小正确。

  3. 内存管理问题:内存泄漏或越界访问可能导致程序崩溃。检查内存分配和释放是否正确。

  4. API使用问题:错误使用鸿蒙提供的加密API可能导致崩溃。确保API调用参数和顺序正确。

  5. 多线程问题:多线程环境下,资源竞争可能导致崩溃。确保线程安全,使用同步机制。

  6. 系统资源问题:系统资源不足可能导致崩溃。检查系统资源使用情况,优化资源管理。

  7. 版本兼容性问题:鸿蒙系统版本更新可能导致API行为变化。确保代码与当前系统版本兼容。

  8. 第三方库问题:使用第三方库时,库的bug或兼容性问题可能导致崩溃。检查第三方库的版本和兼容性。

  9. 日志分析:通过日志分析崩溃原因,定位问题代码。

  10. 调试工具:使用鸿蒙提供的调试工具,如DevEco Studio,进行调试和问题排查。

确保以上问题得到解决,可以有效避免AES算法加密程序崩溃。

回到顶部