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
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. –
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. –