2012-11-07 21 views
6

के साथ डिक्रिप्ट नहीं किया जा सकता है मेरा cocos2d गेम CCCrypt() एन्क्रिप्शन का उपयोग कर डेटा सहेजता है। मैं मैक पते का उपयोग एन्क्रिप्शन कुंजी के रूप में करता हूं। IOS5 में एन्क्रिप्ट की गई सहेजी गई फ़ाइल IOS6 में एक ही मैक पते से डिक्रिप्ट नहीं कर सकती है। इसका मतलब है कि एक उपयोगकर्ता जिसने अपना गेम अपडेट किया है, वह अपना सभी डेटा खो देगा!आईओएस 5 के साथ एन्क्रिप्टेड सीसीसीक्रिप्ट को ios6

क्या पुरानी फ़ाइल को डिक्रिप्ट करने का कोई तरीका है?

कोड यह रहा:

@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

मैं आईओएस 4 से आईओएस 5 तक जाने वाली एक ही समस्या में भाग गया और यह एक त्रुटि हो गई जो 4 में अनदेखा हो रहा था और 4 में अनदेखा नहीं किया गया था। उसी मामले में बफर भर गया था जबकि त्रुटि में ब्लॉक की शुरुआत में बफर को छोटा कर दिया गया था। मेरा सुझाव है कि आप कुछ इसी तरह की तलाश करें। –

+1

आपको मैक पते के आधार पर डेटा एन्क्रिप्ट नहीं करना चाहिए। यदि उपयोगकर्ता एक नया डिवाइस खरीदता है, तो आईट्यून्स से पुनर्स्थापित करता है, तो वे आपके डिवाइस को नए डिवाइस पर डिक्रिप्ट करने में सक्षम नहीं होंगे। –

उत्तर

-3

ठीक है, मुझे समाधान मिला।

कुंजी यहाँ बिंदु:

मैं NSData करने के दो तरीके एन्क्रिप्ट और कोड आधारित IOS5 lib साथ डिक्रिप्ट करने के लिए जोड़ें।

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

IOS6 lib में अब, NSData बदला जा सकता है, इसलिए दो तरीकों अलग काम किया, यह IOS5 में फ़ाइल एन्क्रिप्ट डिक्रिप्ट नहीं कर सकते।

मेरे कोड आधारित आईओएस 6 में, मैंने अपनी कक्षा में विधियों को लिखा। इस तरह:

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

कोड काम अच्छी तरह से IOS5 में के रूप में ही।

0

आप कैसे आप अपने एन्क्रिप्शन, विशेष रूप से क्या विकल्प का इस्तेमाल किया कार्यान्वित पर जानकारी देने के लिए आवश्यकता होगी।

मेरे अनुभव में आईओएस 6 पर विफल डिक्रिप्ट का सबसे आम कारण सीटीआर बग है जिसे उन्होंने बदल दिया/तय किया। आईओएस 5 में, kCCModeOptionCTR_LE विकल्प था जो एक झूठ था। यह वास्तव में kCCModeOptionCTR_BE के साथ एन्क्रिप्ट किया गया। आईओएस 6 में, उन्होंने इसे ठीक किया, और यदि आप kCCModeOptionCTR_LE का उपयोग करने का प्रयास करते हैं तो आपको "अनुपूरक" त्रुटि मिल जाएगी। लेकिन CCCrypt() आमतौर पर सीटीआर मोड का उपयोग नहीं करता है, इसलिए मुझे नहीं पता कि यह लागू होता है या नहीं।

+0

रोब धन्यवाद, मैं कोड पेस्ट करता हूं, 'kCCModeOptionCTR_LE' का उपयोग नहीं करता – gordon

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^