2016-06-08 2 views
0

저는 사과 시계 프로젝트 인 프로젝트에서 AES 암호화 및 암호 해독을 사용하고 있습니다. 암호화와 암호 해독을 위해 NSData에 대해 하나의 카테고리를 만들었고 샘플보기 컨트롤러 클래스에서 해당 메소드를 호출합니다. 잘 작동합니다.이 오류를 해결하는 방법. 이유 : '- [NSConcreteData AES256EncryptWithKey :] : 인식 할 수없는 선택기가 인스턴스 0x7ab084a0으로 전송되었습니다'?

그리고 이제 실제 암호화를 수행해야하는 ServerManager 클래스에 동일한 코드를 복사했습니다. 그러나 그것은 나에게이 오류를 보여주고있다. 오류와

충돌은 : 인해 캐치되지 않는 예외 'NSInvalidArgumentException'응용 프로그램 종료, 이유는

: -

동일한 코드 '[NSConcreteData AES256EncryptWithKey는 :] 알 수없는 선택기 인스턴스 0x7ab084a0로 전송' 샘플 코드에서 작업 중이며 실제 프로젝트에서이 오류를 보여줍니다. 나는 그 이유가 무엇인지 이해하지 못했습니다. 나는 NSConcreteData에 대해 들어 본 적이 없다. 또한. 여기에 내 코드가있다. 내 ServerManager 클래스 클래스에서

:

NSError *err; 


    NSDictionary *dict = @{@"accountType":@"ALL",@"uId":@"c8ff46be-a083-40 

09-8a33-fc2d22cc40e3|123456784",@"deviceId":@"qvxy1234"}; 

    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&err]; 

    NSString *encryptedData = [[jsonData AES256EncryptWithKey:kABAESCryptionKey] base64EncodedStringWithOptions:0]; 

    NSLog(@"%@",encryptedData); 

    NSData *nsdataFromBase64String = [[NSData alloc] 
             initWithBase64EncodedString:encryptedData options:0]; 

을 NSData + CustomCategory 클래스은 다음과 같이이다 :

- (NSData *)AES256EncryptWithKey:(NSString *)key { 

    return [self AES256Operation:kCCEncrypt key:key]; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 

    return [self AES256Operation:kCCDecrypt key:key]; 
} 

/*! 
* @brief Common method for encrypt and decrypt 
* @param Operation : pass required crypto CCOperation type 
* @param key : pass key based on which crption is done 
* @returns NSData object : Encrypted or Decrypted data 
*/ 
- (NSData *)AES256Operation:(CCOperation)operation key:(NSString *)key { 

    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesCrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesCrypted); 
    if (cryptStatus == kCCSuccess) { 

     return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; 
    } 

    free(buffer); //free the buffer 
    return nil; 
} 

동일한 코드 샘플에서 작업하지만 내 실제 프로젝트에 있습니다. ..

추가 :

base64EncodedStringWithOptions : 메소드 때문이 아닙니다.

나는 그래서이 코드는 또한 충돌되어이 또한

NSData *encryptedData = [jsonData AES256EncryptWithKey:kABAESCryptionKey]; 

같은 시도, 그래서 문제가 base64EncodedStringWithOptions:하지 확신 해요? IWatch 확장 클래스에서 사용하는 동안 문제가 발생합니다.

여기서 kABAESCryptionKey는 정상적으로 작동하는 적절한 키입니다. 샘플 예제에서.

답변

0

네, 답을 얻었습니다. 너무 바보 같은 일. 이 카테고리는 내 빌드 빌드 타겟에 추가되지 않습니다. 그래서 그것은 오류를 보여주고있다. 이제 NSData + CustomCategory.m을 추가했는데,이 파일은 내 시계 빌드 타겟에서 제대로 작동했음을 의미합니다.

0

문제가 AES256EncryptWithKey에 있다고 생각합니다. link을 참조하십시오.