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位时程序崩溃,可以选择PKCS5
和PKCS7
进行填充。 - 如果需要
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
更多关于HarmonyOS鸿蒙Next中如何解决AES算法加密程序崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,AES算法加密程序崩溃可能由以下原因导致:
-
密钥长度问题:AES算法支持128位、192位和256位密钥长度。如果密钥长度不符合要求,程序会崩溃。确保密钥长度正确。
-
数据块大小问题:AES加密要求数据块大小为128位。如果数据块大小不符合要求,程序会崩溃。确保数据块大小正确。
-
内存管理问题:内存泄漏或越界访问可能导致程序崩溃。检查内存分配和释放是否正确。
-
API使用问题:错误使用鸿蒙提供的加密API可能导致崩溃。确保API调用参数和顺序正确。
-
多线程问题:多线程环境下,资源竞争可能导致崩溃。确保线程安全,使用同步机制。
-
系统资源问题:系统资源不足可能导致崩溃。检查系统资源使用情况,优化资源管理。
-
版本兼容性问题:鸿蒙系统版本更新可能导致API行为变化。确保代码与当前系统版本兼容。
-
第三方库问题:使用第三方库时,库的bug或兼容性问题可能导致崩溃。检查第三方库的版本和兼容性。
-
日志分析:通过日志分析崩溃原因,定位问题代码。
-
调试工具:使用鸿蒙提供的调试工具,如DevEco Studio,进行调试和问题排查。
确保以上问题得到解决,可以有效避免AES算法加密程序崩溃。