2010-10-17 14 views
5

Chciałbym mieć funkcję szyfrowania plików dla mojej aplikacji iPhone. W przypadku aplikacji opartych na komputerach użyłem poniższej funkcji do zaszyfrowania stosunkowo małych plików:zaszyfrować plik na iphone-sdk

- (NSData *)aesEncrypt:(NSString *)key { 
// 'key' should be 32 bytes for AES256, will be null-padded otherwise 
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

// fetch key data 
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

NSUInteger dataLength = [self length]; 

//See the doc: For block ciphers, the output size will always be less than or 
//equal to the input size plus the size of one block. 
//That's why we need to add the size of one block here 
size_t bufferSize = dataLength + kCCBlockSizeAES128; 
void *buffer = malloc(bufferSize); 

size_t numBytesEncrypted = 0; 



CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
      keyPtr, kCCKeySizeAES256, 
      NULL /* initialization vector (optional) */, 
      [self bytes], dataLength, /* input */ 
      buffer, bufferSize, /* output */ 
      &numBytesEncrypted); 
if (cryptStatus == kCCSuccess) { 
    //the returned NSData takes ownership of the buffer and will free it on deallocation 
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
} 

free(buffer); //free the buffer; 
return nil; 
} 

Ale nie sądzę, że ten kod może być użyty na iPhonie. Jeśli spróbuję zaszyfrować plik 5 MB zajmie co najmniej 10 MB pamięci RAM, ponieważ zostanie załadowany do NSData i zwrócony jako taki. Czy istnieje metoda, która eccrypt pliku poprzez czytanie małych bloków i zapisywanie danych wyjściowych do innego pliku? Albo się mylę o tym trwa tak m

+0

Witam, pracuję również z szyfrowaniem w aplikacji kakao zamiast iPhone'a. W jaki sposób zaimplementowałeś powyższy kod z plikiem, którego użyłeś do zaszyfrowania? Czy używasz NDAlias? Nie mogę wymyślić, jak pobrać zawartość pliku, a następnie zaszyfrować. –

+1

Poddałem się, więc właśnie czytam plik do bufora o stałym rozmiarze, szyfruję bufor i piszę do zaszyfrowanego pliku. Robię to w pętli, ponieważ bufor jest znacznie mniejszy niż sam plik (w celu uniknięcia wiep pamięci) To działa, ale nie jestem pewien, czy to nie wpływa na siłę szyfrowania. – Marius

+0

Witam, Marius
czy to działa? Robię to samo, czytając plik w buforze o ustalonym rozmiarze, a następnie szyfrując ten bufor. Ale kiedy próbuję odszyfrować ten zaszyfrowany plik, wynikiem jest uszkodzony plik. Czy możesz mi pomóc? – Iducool

Odpowiedz

Powiązane problemy