Objective-C
ARC
NSData
Pointer

Objective-CでのXOR演算による暗号化

More than 3 years have passed since last update.

 昨今、バイナリファイルを暗号化する要件がありました。今回、簡潔かつ強力なXOR演算による暗号化を選択します。

 まず、NSDataより抽出したバイナリデータを、XOR演算のためにunsinged intにキャストしました。しかし、ARC規約に反するためエラーとなりコンパイルできません。

 そこで、C言語の関数を用いてバイナリデータの抽出しました。この場合、メモリの開放は忘れないでください。

 それでは、一連の処理の流れをソースコードにて提示します。

NSData* GetXORDecryption(NSString* path)
{
    fpos_t fsize = 0; // encrypted file size(Byte)
    int encmax = 100000; // encrypted length(Byte)
    char pattern = 0b11111111; // encryption pattern(1 Byte)

    // open encryted file
    FILE *file = fopen([path UTF8String], "rb");
    if (file == NULL)
    {
        return nil;
    }

    // get file size
    fseek(file, 0, SEEK_END);
    fgetpos(file, &fsize);
    fseek(file, 0, SEEK_SET);

    // get binary data
    void *data = malloc(fsize);
    fread(data, 1, fsize, file);

    fclose(file);

    // decrypt binary data (XOR calculation)
    char *ptr = (char *) data;

    for (int i=0; i < encmax; i++)
    {
        *ptr ^= pattern;
        ptr++;
    }

    // get return data
    NSData *result = [NSData dataWithBytes:data length:fsize];

    free(data);

    return result;
}

Hex Fiendで確認したところ、XOR演算が適用されていることが確認できます。復号化も問題ありません。

参照