2012-02-05 3 views
0

Я работаю над OSX-приложением с использованием Objective-C, и одна из вещей, которую мне нужно сделать, это чтение текстовых/xml-файлов, которые были зашифрованы на компьютере под управлением Windows, используя простой бит - алгоритм сдвига. Код шифрования на стороне Windows, достаточно прост, в Delphi:Objective-c: прочитать файл, зашифрованный в Windows

const 
    EncryptKey : word = ????; 
var 
    InMS : TMemoryStream; 
    cnt : Integer; 
    c  : byte; 
begin 
    InMS := TMemoryStream.Create; 
    result := TMemoryStream.Create; 
    try 
    InMS.LoadFromFile(FileName); 
    InMS.Position := 0; 
    for cnt := 0 to InMS.Size - 1 do 
     begin 
     InMS.Read(c, 1); 
     c := (c xor not (ord(EncryptKey shr cnt))); 
     result.Write(c, 1); 
     end; 
    finally 
    InMS.Free; 
    end; 
end; 

Проблема в том, что я не могу понять, как правильно читать и расшифровывать это на стороне Mac. Я пробовал различные подходы к использованию NSData без каких-либо успехов.

Любая помощь или предложения были бы весьма признательны.

ответ

1

Может быть, это поможет вам (простая исключающая шифровка):

-(void) decryptData :(NSMutableData *) data{ 
    unsigned char *bytes = (unsigned char *)malloc([data length]); 
    unsigned char magic[4] = {(currentCipher >> 24) & 0xff,(currentCipher >> 16) & 0xff,(currentCipher >> 8) & 0xff,(currentCipher) & 0xff}; 
    [data getBytes:bytes]; 
    int magic_pointer = 0; 
    for (int i = 16; i < [data length]; i++) { 
     bytes[i] ^= magic[magic_pointer];   
     if (magic_pointer == 3) magic_pointer = 0; else magic_pointer++; 
    } 
    free(bytes); 
    [data setData:[NSMutableData dataWithBytes : bytes length: [data length] ]]; 
} 

здесь: currentCipher Вашего EcrytpKey, ^ исключающего. также сдвиг правый в C >>, не оператор !.

+0

Спасибо за пример. Я потрачу время, чтобы проработать его и вернуться к результатам, вопросам и т. Д. –

+0

У меня наконец-то было время, чтобы сесть и заставить его работать. Вы код был большой помощью. Одна запись; побитовый оператор NOT ** ** не ** ** **. Код выглядит так: NSMutableData * fileData = [NSMutableData dataWithContentsOfFile: dataPath]; UInt16 currentCipher = ????; unsigned char * bytes = (unsigned char *) malloc ([длина файлаData]); [fileData getBytes: bytes]; for (int i = 0; i <[длина файла]; i ++) { байт [i]^= ~ (currentCipher >> i); } [fileData setData: [NSMutableData dataWithBytes: длина байтов: [длина файла]]]; Еще раз спасибо. –

Смежные вопросы