LoginSignup
4
3

More than 5 years have passed since last update.

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

Posted at

 昨今、バイナリファイルを暗号化する要件がありました。今回、簡潔かつ強力な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演算が適用されていることが確認できます。復号化も問題ありません。

参照

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3