Posted at

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演算が適用されていることが確認できます。復号化も問題ありません。


参照