1

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

4

1 回答 1

3

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

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

于 2013-07-19T09:55:41.333 回答