2012-11-07 16 views
6

私のcocos2dゲームは、CCCrypt()暗号化を使用してデータを保存します。私は、暗号化キーとしてMACアドレスを使用します。 IOS5で暗号化されたファイルを保存すると、IOS6の同じMACアドレスで解読することができません。つまり、ゲームを更新したユーザーは、すべてのデータを失うことになります。ios5で暗号化されたCCCryptは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

私は、iOS4からiOS5への同様の問題に遭遇しました。これは、発生していたエラーであることが判明し、4で無視されました。同じように、5では無視されませんでした。他のバッファではエラーがブロックの先頭で切り捨てられました。私はあなたに似たものを探すことをお勧めします。 –

+1

MACアドレスに基づいてデータを暗号化しないでください。ユーザーが新しいデバイスを購入し、iTunesから復元すると、新しいデバイスの保存データを復号化することはできなくなります。 –

答えて

-3

私は解決策を見つけました。ここ

キーポイント:

私は暗号化して、コードベースのIOS5 libにして復号化するためのNSDataに2つのメソッドを追加します。

IOS6では、NSDataが変更される可能性があるため、2つの方法が異なるため、IOS5で暗号化されたファイルを復号化できません。

私のコードベースのIOS6では、私は自分のクラスにメソッドを書きました。このような :

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

IOS5でも同じコードの仕事。

0

あなたが使用し、特にどのようなオプションは、あなたの暗号化を実装する方法の詳細を提供する必要があると思います。

私の経験では、iOS 6の復号化に失敗する最も一般的な原因は、変更/修正されたCTRのバグです。 iOS 5では、嘘だったオプションkCCModeOptionCTR_LEがありました。実際にはkCCModeOptionCTR_BEで暗号化されています。 iOS 6ではこれを修正し、kCCModeOptionCTR_LEを使用しようとすると「実装されていません」というエラーが表示されます。しかし、CCCrypt()は一般的にCTRモードを使用しないので、これが当てはまるかどうかわかりません。

+0

Robありがとう、私はコードを貼り付け、 'kCCModeOptionCTR_LE'は使用しない – gordon

関連する問題