2012-07-14 14 views
13

Pytanie dotyczy aplikacji iOS5. Mam kontroler widoku, w którym mam niektóre UITextFields. Chciałbym szyfrować dane za pomocą AES-256.iOS 5: Szyfrowanie danych AES-256 EncryptWithKey: nie znaleziono

W rzeczywistości nie wiem, jakie są wstępnie wymagane pakiety, które muszę dodać do szyfrowania i deszyfrowania. Przeszedłem przez inne posty, ale zbyt wiele wyjaśnień go pomieszało.

Prosimy daj mi znać co i wszystkie pakiety, pliki nagłówkowe muszę należą do szyfrowania danych za pomocą AES-256

Chandra

+0

to sprawdzić: http: //stackoverflow.com/questions/1400246/a es-encryption-for-an-nsstring-on-the-iphone – Adam

+0

@Adam: Pakiety i pliki nagłówkowe do uwzględnienia nie są wymienione. – Chandu

+0

Ta odpowiedź zapewnia kompletne rozwiązanie: http://stackoverflow.com/a/5078432/730701 – Adam

Odpowiedz

37

przekazać następującą kategorię.

Często zadawane pytania: Co to jest kategoria?

Krótko mówiąc, interfejs API kakao umożliwia dodanie tej metody. krótko rozwiń klasę.

Więcej informacji

CustomizingExistingClasses

Category

File-New-Cocoa Touch - Objective-C kategoria

Jeśli chcesz użyć kategorię twoja klasa dodaj #import "NSData + Encryption.h"

enter image description here

enter image description here

//NSData+Encryption.h

@interface NSData (Encryption) 
- (NSData *)AES256EncryptWithKey:(NSString *)key; 
- (NSData *)AES256DecryptWithKey:(NSString *)key; 
@end 

//NSData+Encryption.m

#import "NSData+Encryption.h" 
#import <CommonCrypto/CommonCryptor.h> 

@implementation NSData (Encryption) 
- (NSData *)AES256EncryptWithKey:(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; 
} 

- (NSData *)AES256DecryptWithKey:(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 numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 
@end 
+8

+1 za niepotrzebne usunięcie. –

+0

czy to jest mądre, czy jest jakiś sposób na zrobienie tego bezpośrednio z nsstrings, bez nsdata? – Esqarrouth

+0

Nie mogę powiedzieć wystarczająco, jak bardzo jestem pod wrażeniem tego rozwiązania. –