지금 개발하고 있는 App 중에 서버로 부터 받은 string데이터를
AES 암호화 알고리즘을 이용하여 복호화 하여, 그안의 TRUE 데이터를 뽑고 싶었다.
하지만 복호화를 하여도 데이터가 깨지는 현상이 발생 했다.
처음에는 인코딩 오류라고 생각 했으나 결로는 아니었다.
아래는 혹 이글을 보시고 참고가 될 분들을 위해서 금일 맥부기에 작성한 글을 올려 본다.
================================================================================
FINAL : http://cdn-previnuwn÷ÆŽª)CzQe£rUi¢[ßبⓒÞ‰X•EoμI¢‹®z3¿J›Ø
url 정보가 잘 나온것 처럼 보이나 previ 이후로는 깨진것 같습니다.
제생각에는 깨졌으면 다같이 깨져야지 저렇게 특정 부분 이후로 만 저렇게 나오는게 이해가 안되는데요...
제가 인코딩을 잘 못한건지 무엇을 잘 못한건지.... 또는 왜 저런 현상이 일어 나는지 잘 모르겠습니다.
혹시 AES 암호화 알고리즘이 잘못 된걸까요? 고수님들의 절실한 도움이 필요 합니다 ㅠㅠ
(참고로 같은 key를 사용중인 안드로이드 에선 디크립션이 잘 됩니다.)
코드 적어 볼게요.
* 참고한 AES 소스 입니다.
-----------------------
NSString *tempKey = [key stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//key값 변경
NSData *ret = [self decodeHexString:base64Text];
//base64Text는 현제 인크립션된 스트링 입니다.
@"94025a5fd9a2ebcf5326087f6087ce5da999d03ebeb5872891bf23b83e7ba6fc2ec0d1f991b8ca4a528e2e1da8bbe732e60422001316697904fb961ae435ce888356e6a2bb86211a3690df792794d95f"
NSLog(@"DATA : %@ : %d", ret, [ret length]);
//Data타입으로 변경 된 것을 확인.
<94025a5f d9a2ebcf 5326087f 6087ce5d a999d03e beb58728 91bf23b8 3e7ba6fc 2ec0d1f9 91b8ca4a 528e2e1d a8bbe732 e6042200 13166979 04fb961a e435ce88 8356e6a2 bb86211a 3690df79 2794d95f> : 80
NSLog(@"MIDDLE : %@",[ret AES256DecryptWithKey:tempKey]);
//디크립션 후 인코딩 하기 전의 데이터 를 찍어보았습니다. (데이터 존재 확인)
<68747470 3a2f2f63 646e2d70 72657669 f175776e f7c68eaa 29437a51 03e8a372 daeda25b dfd8a819 a9de1689 581e95c8 1af4b5ce a28bae7a 33bf4a7f 9bd8810b>
plainText = [[NSString alloc] initWithData:[ret AES256DecryptWithKey:key] encoding:NSASCIIStringEncoding];
NSLog(@"FINAL : %@", plainText);
FINAL : http://cdn-previnuwn÷ÆŽª)CzQe£rUi¢[ßبⓒÞ‰X•EoμI¢‹®z3¿J›Ø
----------------------------------------------------------------------
해결 했습니다.
저같이 괜한것 때문에 고생 하시는 분이 안계시도록 상세히 적어 볼게요.
일단 문제는 암호화의 설정 값이 잘못되었습니다.
서버측에서 보내온 암호화된 url은 AES/ECB/Nopadding 입니다.
근데 제가 찾아 봤던 모든 iOS Api들은 저 값들을 설정 하는 방법이 없더라구요. (없던게 아니었습니다...)
실제 AES256DecryptWithKey: 메소드를 들어 가 보면 함수는 아래 와 같이 구현되어 있습니다.
밑에 빨간색으로 칠한 부분 입니다.
찾아봤던 모든 API들이 하나 같이 아래와 같은 형식으로 복호화를 하더라구요...
(전 당연하게...아~ 저게 표준이구나....no padding 이겠구나 생각 했었습니다....ㅠㅠ)
아래의 붉은 부분을 - > kCCOptionECBMode+0x0000
이렇게 바꾸어 주면 ECB 설정의 패딩은 없이 하겠다라는 의미 입니다.
고수님들은 다들 아시겠지만...저같은 초보는 +연산으로 옵션처리를 저렇게 하는지 생각치도 못했네요...
혹 고생 하시는 분은 이글 보고 해결 하시길 빌면서.... 마칩니다...
- (NSString *)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 [NSMutableData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return [[NSString alloc] initWithData:[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]encoding:NSASCIIStringEncoding];
}
free(buffer); //free the buffer;
return nil;
}
이상!
'Software > iOS & Objective-C' 카테고리의 다른 글
Xcode 개발관련 설정 (0) | 2015.09.10 |
---|---|
ARC와 strong, weak, 그리고 cycle (0) | 2015.06.22 |
NSString 변환 <—> NSData, char[] (0) | 2014.02.11 |
iPhone Application Life cylce (0) | 2013.05.16 |
About...Notification...!!! (0) | 2013.04.23 |