저는 사과 시계 프로젝트 인 프로젝트에서 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는 정상적으로 작동하는 적절한 키입니다. 샘플 예제에서.