13

CCCrypt()iOS5で非常にうまく機能する復号化/暗号化方法を使用しました。現在、私は iOS6 SDK を使用しており、コードを変更したことはありませんが、何かが壊れているようです。キーを使用して文字列を暗号化して復号化することはできますが、別のキーを使用して同じ文字列を復号化すると、復号化が失敗した場合でも、NSData が満たされないため、元に戻ることはありませんCCCryptStatus。iOS5 では、エラー メッセージ -4303 が表示されましたが、これを処理できました。今何が間違っている可能性がありますか?CCCrypt()0(kCCSuccess)

私のコード:

char keyPtr[kCCKeySizeAES256+1]; 
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

if (encryptOrDecrypt == kCCDecrypt)
{
    data = [GTMBase64 decodeData:data];
}

NSUInteger dataLength = [data length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(encryptOrDecrypt,
                                      kCCAlgorithmAES128,
                                      kCCOptionPKCS7Padding,
                                      keyPtr,
                                      kCCKeySizeAES256,
                                      NULL ,
                                      [data bytes], dataLength, 
                                      buffer,       bufferSize, 
                                      &numBytesDecrypted);

if (cryptStatus != kCCSuccess){
    // do something, but cryptStatus is always 0!
}

編集:iPad Simulator 5でテストしました。別のキーで復号化すると、ステータスは-4303になります。ios6 でのみステータスが 0 に戻ります。

4

2 に答える 2

3

私は暗号化の専門家ではありませんが、同じ問題があり、実際の解決策が見つかるまで回避策を考えました。

私がしたのは、どのiOSが実行されているかを把握することだけで、6+ではCCCrypt呼び出しをパディングなしに変更しています(0はパディングなし、1はkCCOptionPKCS7Paddingの列挙型です)

float version = [[UIDevice currentDevice].systemVersion floatValue];
if (version >= 6)
{
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          [self bytes], dataLength,
                                          buffer, bufferSize, 
                                          &numBytesDecrypted );


    if( cryptStatus == kCCSuccess )
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free( buffer ); 
    return nil;
}
else
{
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 1,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          [self bytes], dataLength,
                                          buffer, bufferSize, 
                                          &numBytesDecrypted );
    if( cryptStatus == kCCSuccess )
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free( buffer );
    return nil;
}
于 2012-10-05T05:35:03.467 に答える
0

この問題について議論しているアップル開発者フォーラムのスレッドがあり、このトピックに関する情報が豊富です。パディングオプションは多くの人にとって問題のようです。コメント #11 は、解決策の議論が始まる場所です。

于 2012-10-23T00:06:51.890 に答える