2012-11-07 10 views
6

Mein cocos2d Spiel speichert Daten mit CCCrypt() Verschlüsselung. Ich benutze die MAC-Adresse als Verschlüsselungsschlüssel. Die in IOS5 verschlüsselte Sicherungsdatei kann nicht mit der gleichen MAC-Adresse in IOS6 entschlüsselt werden. Das bedeutet, dass ein Benutzer, der sein Spiel aktualisiert hat, alle seine Daten verliert!CCCrypt verschlüsselt mit ios5 kann nicht mit ios6 entschlüsselt werden

Gibt es eine Möglichkeit, die alte Datei zu entschlüsseln?

Hier Code:

@implementation NSData (AESAdditions) 
- (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 
+0

Ich stieß auf ein ähnliches Problem von iOS4 zu iOS5 und es stellte sich heraus, dass ein Fehler, der aufgetreten ist und in 4 ignoriert wurde nicht auf die gleiche Weise in 5 ignoriert wurde. In einem Fall wurde der Puffer gefüllt der Fehler, während in der anderen der Puffer am Anfang des Blocks abgeschnitten wurde. Ich würde vorschlagen, dass Sie nach etwas Ähnlichem suchen. –

+1

Sie sollten die Daten nicht basierend auf der MAC-Adresse verschlüsseln. Wenn der Benutzer ein neues Gerät kauft und dann von iTunes wiederherstellt, kann es die gespeicherten Daten auf dem neuen Gerät nicht mehr entschlüsseln. –

Antwort

-3

Ok, ich habe die Lösung gefunden.

Schlüsselpunkt hier:

Ich füge zwei Methoden, um NSData zu verschlüsseln und mit dem Code basiert IOS5 lib zu entschlüsseln.

@implementation NSData (AESAdditions) 
-(NSData*)AES256EncryptWithKey:(NSString*)key; 
-(NSData *)AES256DecryptWithKey:(NSString *)key 

in iOS6 lib Nun NSData geändert werden könnte, so dass zwei Methoden gearbeitet anders, es die Datei zu verschlüsseln in IOS5 nicht entschlüsseln kann.

In meinem Code-basierten IOS6 habe ich Methoden in meiner Klasse geschrieben. wie folgt aus:

- (NSData*)AES256EncryptWithKey:(NSString*)key data:(NSData *)data; 
- (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data; 

der Code gut funktionieren gleich wie in IOS5.

0

Sie müssen Details geben, wie Sie Ihre Verschlüsselung implementiert, vor allem, welche Möglichkeiten Sie verwenden.

Die häufigste Ursache für fehlgeschlagene Entschlüsselungen auf iOS 6 nach meiner Erfahrung ist der CTR-Fehler, den sie geändert/behoben haben. In iOS 5 gab es die Option kCCModeOptionCTR_LE, die eine Lüge war. Es ist tatsächlich mit kCCModeOptionCTR_BE verschlüsselt. In iOS 6 haben sie das behoben, und wenn Sie versuchen, kCCModeOptionCTR_LE zu verwenden, erhalten Sie einen "nicht implementierten" Fehler. Aber CCCrypt() verwendet im Allgemeinen nicht den CTR-Modus, daher weiß ich nicht, ob dies zutrifft.

+0

Rob danke, ich füge den Code, nicht 'KCCModeOptionCTR_LE' – gordon

Verwandte Themen