如果删除kCCOptionPKCS7Padding,则以下函数将为我返回带有空密码数据的正确缓冲区大小。我无法使用kCCDecrypt选项将空密文解密为纯文本。 char keyPtr[kCCKeySizeAES128 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; memset(ivPtr, 0, sizeof(ivPtr)); [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode|kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesCrypted); return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];如果不存在kCCOptionPKCS7Padding,则加密引擎不起作用。因此,它看起来像是强制性的,而不是选择。我的问题:谁使CCCrypt()在没有PKCS7填充的情况下工作? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 这与输入数据的块对齐有关。如果输入数据长度不是加密块大小的整数倍,则必须添加填充以完成最后一个块。 CCCryptorUpdate的头文件中对此进行了一些讨论(CCCrypt实际上是CCCryptorCreate,CCCryptorUpdate,CCCryptorFinal和CCCryptorRelease依次调用): 使用分组密码执行对称加密时, 并通过kCCOptionPKCS7Padding启用填充 此函数的所有调用提供的字节数 加密可以是任意的(即总数 字节不必进行块对齐)。但是如果 填充被禁用,或者在解密时,总数 的字节数必须与块大小对齐;除此以外 CCCryptFinal()将返回kCCAlignmentError。 (adsbygoogle = window.adsbygoogle || []).push({});
10-08 18:59