1

次の状況があります。復号化する必要がある NSData があります。データは次のもので構成されます。

  • 固定長ファイル ヘッダー
  • 暗号化されたコンテンツ

私は復号化に CCCrypt を使用していますが、これは NSData 関連の質問であるため、おそらく問題ではありません。これは私が今物事を分離している方法です(疑似コード):

int hdrsize; // this contains the size of the header
NSData *data; // this contains full encrypted data with a header

// this gives me information, stored in the header + some additional stuff
NSDictionary *hdr = [self _headerInfoFromData:data];

// THIS IS THE PROBLEM AREA
data = [data subdataWithRange:NSMakeRange(hdrsize, [data length] - hdrsize)];

// And the decryption part
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, MS_SEC_ENC_ALGORITHM, kCCOptionPKCS7Padding,
                                      [key bytes], MS_SEC_ENC_KEY_SIZE,
                                      [[hdrdict objectForKey:@"iv"] bytes],
                                      [data bytes], dataLength,
                                      buffer, bufferSize,

ご覧のとおり、ここでの問題は、復号化のためにヘッダーなしで NSData の一部を抽出する必要があることです。しかし、コピーを作成する代わりに、すでに存在するバイトを何らかの方法で「再利用」する方法はありますか? 最初の X バイトをスキップして代わりに CCCrypt に渡すことで、コピーなしのバイト バッファを作成する何らかの方法があるのではないでしょうか?

ご協力いただきありがとうございます

4

1 に答える 1

0

-subdataWithRange:バイトをコピーすることを確認しましたか? その場合は、いつでも使用できますが、+dataWithBytesNoCopy:length:所有権を適切に処理するようにしてください。

編集

私はとてもばかです。これを行うだけです:

int hdrsize; // this contains the size of the header
NSData *data; // this contains full encrypted data with a header

// this gives me information, stored in the header + some additional stuff
NSDictionary *hdr = [self _headerInfoFromData:data];

// And the decryption part
CCCryptorStatus cryptStatus = CCCrypt(
    kCCDecrypt,
    MS_SEC_ENC_ALGORITHM,
    kCCOptionPKCS7Padding,
    [key bytes],
    MS_SEC_ENC_KEY_SIZE,
    [[hdrdict objectForKey:@"iv"] bytes],
    data.bytes + hdrsize,
    data.length - hdrsize,
    buffer,
    bufferSize,
于 2014-01-24T13:24:57.833 に答える