ios - 对象C:在CommonCrypto中,如果CCCrypt()不使用选项kCCOptionPKCS7Padding,则结果缓冲区为空

标签 ios objective-c commoncrypto

如果删除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填充的情况下工作?

最佳答案

这与输入数据的块对齐有关。如果输入数据长度不是加密块大小的整数倍,则必须添加填充以完成最后一个块。 CCCryptorUpdate的头文件中对此进行了一些讨论(CCCrypt实际上是CCCryptorCreate,CCCryptorUpdate,CCCryptorFinal和CCCryptorRelease依次调用):

使用分组密码执行对称加密时,
并通过kCCOptionPKCS7Padding启用填充
此函数的所有调用提供的字节数
加密可以是任意的(即总数
字节不必进行块对齐)。但是如果
填充被禁用,或者在解密时,总数
的字节数必须与块大小对齐;除此以外
CCCryptFinal()将返回kCCAlignmentError。

关于ios - 对象C:在CommonCrypto中,如果CCCrypt()不使用选项kCCOptionPKCS7Padding,则结果缓冲区为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17740113/

相关文章:

ios - Swift 3.0 中的 NSIndexPath 和 IndexPath

objective-c - 如何从点数组创建 CGPathRef

ios - 有没有办法在设备之间共享应用程序配置?

ios - CGImage内存泄漏

objective-c - NSTextFieldCell 垂直对齐,解决方案似乎压扁了水平对齐

ios - 当我解密密文时,CommonCrypto 是否可靠地知道我的 key 何时无效?

ios - CCCrypt 填充选项似乎不影响解密

php - 具有 PKCS7 填充编码数据的 AES 256 具有一半 ECB 和一半 CBC block

ios - 无法使用 XMPPFramework 连接到远程服务器

ios - 在 NSDate 中单独存储日期和时间