PDF をダウンロード サーバーに置く前に何らかの方法でスクランブルし、アプリがユーザーに表示する前にスクランブルを解除するとします。
その後、アプリで次の操作を実行できます。
- スクランブルされた PDF ファイルを
NSData
オブジェクトに読み込みます。
- オブジェクト
NSMutableData
を作成し、選択したアルゴリズムを使用して PDF データをそのバッファーにデスクランブルします。
- これで、使用可能な PDF ドキュメントがメモリに保存されましたが、ディスクにはスクランブルされたバージョンしかありません。作成する必要がある場合は、最初に単純なキャストによって無料でブリッジされる
CGPDFDocumentRef
デスクランブルされたオブジェクトを使用してデータプロバイダーを作成することでそれを行うことができますNSMutableData
CFData
何かのようなもの
NSMutableData *data = descrambled PDF;
CFDataRef myPDFData = (CFDataRef)data;
CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(provider);
(そのスニペットのクレジットはこの回答にあります。)
アプリは PDF のスクランブルを解除できる必要があり、ユーザーはアプリとスクランブルされた PDF ファイルの両方にアクセスできるため、抽出を防ぐために行うことは、基本的に不明瞭によるセキュリティになります。したがって、複雑な暗号化アルゴリズムを気にする必要はありません。おそらく、アプリのバイナリに隠されている秘密の文字列を使用してデータを XOR するなどの単純なことを行うことができます。
このアプローチを無効にするには、攻撃者がバイナリを分解する必要があります。現在のビデオ ゲームの DRM の悲惨な状態が示すように、誰かがそう判断した場合、あなたは勝つことができません。
ところで、あいまいさの精神から、スクランブルされたダウンロードした PDF に、valuabledocument.pdf
. しかし、本当のセキュリティはそうではありません。
XOR データを説明するために編集します。
このようなものにスクランブルエサを与えてくださいNSData
...
// Fill this out with whatever you want. Use the same string
// and algorithm to scramble the files on the server.
static unsigned char secretString[SECRET_STRING_LENGTH];
- (NSData *)scrambleOrDescrambleData:(NSData*)input
{
unsigned char *outputBytes = malloc(input.length);
memcpy(outputBytes, input.bytes, input.length);
for (int i = 0; i < input.length; i++)
{
outputBytes[i] = outputBytes[i] ^ secretString[i % SECRET_STRING_LENGTH];
}
NSData *outputData = [[NSData alloc] initWithBytes:outputBytes length:input.length];
free(outputBytes);
return outputData;
}
XOR の便利な点は、2 回実行すると元のデータが返されるため、スクランブルとデスクランブルは同じコードになることです。
ここでは暗号化という用語を避けています。これは実際にはデータを難読化して、偶然の観察者から守るためです。