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