真机调用Objective-C AES解密方法触发SIGABRT报错求助
看起来你遇到的是iOS真机上的AES解密崩溃问题,模拟器因为环境宽松没有触发,但旧版iOS真机的内存和安全检查更严格,导致了SIGABRT。我先帮你分析代码里的几个致命问题,再给出修复方案和额外排查点:
代码中的核心问题
错误的IV与密钥处理
你直接把keyPtr同时用作密钥和IV传入CCCrypt,而且用getCString:maxLength:转换NSString到C字符串时没有检查转换结果。如果密钥包含非ASCII字符(比如中文、特殊符号),这个转换会失败,导致keyPtr保持全0的无效状态,在真机上触发加密库的异常。错误的数据长度与错误处理顺序
你先基于bufferSize创建了解密后的NSData,再检查CCCrypt的返回状态。如果解密失败,缓冲区里的内容是无效的,此时创建NSData会导致未定义行为——这大概率是真机崩溃的直接原因。另外,用bufferSize而不是实际解密成功的decryptedBytesSize生成NSData,会包含多余的垃圾字节,也可能引发内存访问问题。内存泄漏
你用malloc分配了缓冲区,但没有在解密失败或返回数据后释放,虽然这不会直接崩溃,但会造成内存泄漏,长期运行会影响应用稳定性。
修复后的代码
我重写了你的方法,修复了上述问题,同时用更安全的NSData转换代替C字符串操作:
+ (NSData *)aesDecrypt:(NSURL *)url withKey:(NSString *)key { // 读取文件数据并检查有效性 NSData *encryptedData = [NSData dataWithContentsOfURL:url]; if (!encryptedData) { NSLog(@"Failed to read file from URL: %@", url); return nil; } // 将密钥转换为NSData(UTF8编码更可靠) NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; if (keyData.length != kCCKeySizeAES128) { NSLog(@"AES128 requires a 16-byte (128-bit) key"); return nil; } // 注意:这里临时沿用你原逻辑的IV(不推荐,仅做适配) // 正确做法是加密时生成随机IV,和密文一起存储,解密时取出对应IV NSData *ivData = keyData; // 分配解密缓冲区 size_t bufferSize = encryptedData.length + kCCBlockSizeAES128; void *decryptBuffer = malloc(bufferSize); if (!decryptBuffer) { NSLog(@"Failed to allocate memory for decryption"); return nil; } size_t actualDecryptedLength = 0; CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyData.bytes, kCCKeySizeAES128, ivData.bytes, encryptedData.bytes, encryptedData.length, decryptBuffer, bufferSize, &actualDecryptedLength ); NSData *decryptedData = nil; if (cryptStatus == kCCSuccess) { // 使用实际解密成功的字节长度创建NSData,自动管理内存 decryptedData = [NSData dataWithBytesNoCopy:decryptBuffer length:actualDecryptedLength freeWhenDone:YES]; } else { NSLog(@"AES decryption failed with status code: %d", cryptStatus); free(decryptBuffer); } return decryptedData; }
额外排查点
真机文件权限
确保你读取的文件URL在应用沙盒范围内,或者已经申请了对应权限(比如相册、文件App的访问权限)。iOS真机的沙盒限制比模拟器严格,访问未授权的文件会触发崩溃。链接器配置
对于iOS 11.3.1这类旧系统,尝试在Other Linker Flags中添加-framework CommonCrypto,确保CommonCrypto库被正确链接。架构适配
检查项目的Architectures设置,确保包含arm64(iPhone 6是arm64架构),避免因架构不兼容导致的崩溃。
内容的提问来源于stack exchange,提问作者myoungjin

