2

コードは次のとおりです。

- (NSData *) doCipher: (NSData *) plainData key: (NSData *) symmetricKey context:   (CCOperation) encryptOrDecrypt padding: (CCOptions *) pkcs7
{
// Initialization vector; dummy in this case 0's.
uint8_t iv[kChosenCipherBlockSize];
bzero((void *) iv, (size_t) sizeof(iv));

// We don't want to toss padding on if we don't need to
if (encryptOrDecrypt == kCCEncrypt)
{
    if (*pkcs7 != kCCOptionECBMode)
    {
        if ((plainData.length  % kChosenCipherBlockSize) == 0)
            *pkcs7 = 0x0000;
        else
            *pkcs7 = kCCOptionPKCS7Padding;
    }
}
else if (encryptOrDecrypt == kCCDecrypt)
{
    *pkcs7 = 0x0000;
}
else
{
    DLog(@"Invalid CCOperation parameter [%d] for cipher context.", *pkcs7);
    return nil;
}

// Actually perform the encryption or decryption.
NSMutableData *dataOut  = [NSMutableData dataWithLength: plainData.length + kChosenCipherBlockSize];
size_t movedBytes       = 0;

CCCryptorStatus ccStatus = CCCrypt(encryptOrDecrypt,
        kCCAlgorithmAES128,
        *pkcs7,
        symmetricKey.bytes,
        kChosenCipherKeySize,
        iv,
        [plainData bytes],
        [plainData length],
        [dataOut mutableBytes],
        [dataOut length],
        &movedBytes
);

if (ccStatus == noErr)
{
    dataOut.length = movedBytes;
}
else
{
    DLog(@"Problem with encipherment ccStatus == %d", ccStatus);
    return nil;
}

return dataOut;
}

kCCDecrypt で kCCOptionPKCS7Padding を使用すると、エラー コード 4304 が表示されることがあります エラーが発生しません。ただし、kCCDecrypt 後のデータ長が、kCCEncrypt 前の元のデータ長と同じでない場合があります。これは、元のデータ長にエンコード ブロック サイズが乗算されていないためだと思います。

他の誰かがこの問題を抱えていますか?

4

1 に答える 1

2

パディングを捨てることはできません。パディングをオンのままにしておけば、すべて問題ありません。

参照: SecKeyWrapper ブレーク (ccStatus == -4304) を使用した UTF8 の 16 バイトの暗号化

于 2012-06-14T20:40:01.930 に答える