2012-11-07 31 views
6

Cocos2d oyunum CCCrypt() şifrelemesini kullanarak veri kaydeder. Mac adresini şifreleme anahtarı olarak kullanıyorum. IOS5'te şifrelenen kayıt dosyası, IOS6'da aynı mac adresiyle şifresini çözemez. Bu, oyunlarını güncelleyen bir kullanıcının tüm verilerini kaybedeceği anlamına gelir!ios5 ile şifrelenmiş CCCrypt ios6 ile çözülemez

Eski dosyanın şifresini çözmenin bir yolu var mı?

İşte kod:

@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

iOS4'ten iOS5'e giden benzer bir soruna rastladım ve ortaya çıkan ve 4'teki göz ardı edilmeyen bir hata olduğu ortaya çıktı. Aynı durumda 5'de göz ardı edilmedi. Diğer sırada tampon, bloğun başlangıcında kesildi. Benzer bir şey aramanızı öneririm. –

+1

Verileri MAC adresine göre şifrelememelisiniz. Kullanıcı yeni bir cihaz satın alırsa ve daha sonra iTunes'dan geri yüklerse, yeni cihazdaki kayıt verilerinizin şifresini çözemez. –

cevap

-3

Tamam, çözümü buldum. Burada

Anahtar nokta:

Ben şifrelemek ve kod tabanlı IOS5 lib ile şifresini çözmek için NSData için iki yöntem ekleyin. Şimdi iOS6 lib

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

, NSData değişmiş olabilir, bu nedenle iki yöntem farklı çalıştı, bu iOS5 dosya şifrelemek şifresini çözemez.

Kod tabanlı IOS6'mda, sınıfımda yöntemler yazdım. Böyle :

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

iOS5 yanı aynı kod çalışır.

0

Sen kullanmış özellikle hangi seçenekleri sunduğunu şifreleme uygulamaya nasıl bilgi vermek gerekiyordu.

iOS 6'da edindiğim başarısız şifrelemelerin en yaygın nedeni deneyimlerimde değiştikleri/düzelttikleri TO hatasıdır. IOS 5'te, bir yalan olan kCCModeOptionCTR_LE seçeneği vardı. Aslında kCCModeOptionCTR_BE ile şifrelenmiştir. IOS 6'da bunu düzelttiler ve kCCModeOptionCTR_LE'u kullanmaya çalışırsanız, "uygulanamaz" hatası alırsınız. Ancak CCCrypt() genellikle CTR modunu kullanmaz, dolayısıyla bunun geçerli olup olmadığını bilmiyorum.

+0

Rob teşekkür ederim, kodu yapıştırıyorum, 'kCCModeOptionCTR_LE' kullanmayın – gordon

İlgili konular