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

Posted

技术标签:

【中文标题】Obj-C:在 CommonCrypto 中,如果 CCCrypt() 不使用选项 kCCOptionPKCS7Padding,则结果缓冲区为空【英文标题】:Obj-C: In CommonCrypto, if the CCCrypt() do not use option kCCOptionPKCS7Padding, the result buffer is empty 【发布时间】:2013-07-19 07:12:40 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

具有讽刺意味的是,手动使用此管道,似乎不需要对齐;只有CCCrypt 快捷方式失败。

以上是关于Obj-C:在 CommonCrypto 中,如果 CCCrypt() 不使用选项 kCCOptionPKCS7Padding,则结果缓冲区为空的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用 CommonCrypto 的 PBKDF2

Obj-c - 如果 textView 为空,则禁用 uibutton?

Obj-c - 如果没有搜索结果,返回表格视图中的 1 个单元格?

带有 CommonCrypto 的 AES 使用太多内存 - Objective-C

Obj-C:读取照片库中视频的 URL

如果满足条件,则 Obj-C 停止程序