如何在另一种模式下制作CCCrypt计算AES?

时间:2017-07-12 14:41:30

标签: objective-c cryptography aes commoncrypto ctr-mode

一次性加密方法CCCrypt的签名是这样的(来自CommonCryptor.h):

CCCryptorStatus CCCrypt(
    CCOperation op,         /* kCCEncrypt, etc. */
    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
    CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
    const void *key,
    size_t keyLength,
    const void *iv,         /* optional initialization vector */
    const void *dataIn,     /* optional per op and alg */
    size_t dataInLength,
    void *dataOut,          /* data RETURNED here */
    size_t dataOutAvailable,
    size_t *dataOutMoved)

这些参数似乎都没有接受CCMode值(可能是偷偷摸摸的,因为所有的枚举都是整数?)。我试过将它与CCOptions参数结合起来,但无济于事;这两个枚举不是选项,也没有明确的结合。

在那里没有明确记录,但我猜测我在网络上发现kCCAlgorithmAES使用的模式是CBC。

如何更改CCCrypt使用的AES模式?

1 个答案:

答案 0 :(得分:0)

文档说:

  

CCCrypt   无状态,一次性加密或解密操作。   这基本上执行CCCrytorCreate() [sic]的序列,   CCCryptorUpdate()CCCryptorFinal()CCCryptorRelease()

现在,CCCryptorCreate似乎也不接受模式参数;事实上,我们see CBC确实是硬编码的(除了允许我们使用ECB的那个,有点武断):

/* Determine mode from options - old call only supported ECB and CBC 
   we treat RC4 as a "mode" in that it's the only streaming cipher
   currently supported 
*/
if(alg == kCCAlgorithmRC4) mode = kCCModeRC4;
else if(options & kCCOptionECBMode) mode = kCCModeECB;
else mode = kCCModeCBC;

如果我们想要使用其他模式,我们必须使用CCCryptorCreateWithMode。因此,遗憾的是,似乎无法更改CCCrypt的模式。