우선 암호화 / 복호화 하는 함수를 알려드리겠습니다.
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
/*************************************************************************************************/ - (NSString *)encryptDES:(NSString *)str { NSLog(@"encrypt input string : %@", str); NSLog(@"input length : %d", [str length]); NSData *data = [str dataUsingEncoding: NSUTF8StringEncoding]; NSLog(@"data : %@", data); unsigned char *input = (unsigned char*)[data bytes]; NSUInteger inLength = [data length]; NSInteger outLength = ((inLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1)); unsigned char *output =(unsigned char *)calloc(outLength, sizeof(unsigned char)); bzero(output, outLength*sizeof(unsigned char)); size_t additionalNeeded = 0; unsigned char *iv = (unsigned char *)calloc(kCCBlockSizeDES, sizeof(unsigned char)); bzero(iv, kCCBlockSizeDES * sizeof(unsigned char)); NSString *key = @"abcdefg123123123"; const void *vkey = (const void *) [key UTF8String]; CCCryptorStatus err = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding | kCCOptionECBMode, vkey, kCCKeySizeDES, iv, input, inLength, output, outLength, &additionalNeeded); NSLog(@"encrypt err: %d", err); if(0); else if (err == kCCParamError) NSLog(@"PARAM ERROR"); else if (err == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL"); else if (err == kCCMemoryFailure) NSLog(@"MEMORY FAILURE"); else if (err == kCCAlignmentError) NSLog(@"ALIGNMENT"); else if (err == kCCDecodeError) NSLog(@"DECODE ERROR"); else if (err == kCCUnimplemented) NSLog(@"UNIMPLEMENTED"); NSString *result; NSData *myData = [NSData dataWithBytesNoCopy:output NSLog(@"data : %@", myData); NSLog(@"encrypted string : %s", [myData bytes]); NSLog(@"encrypted length : %d", [myData length]); result = [myData base64Encoding]; NSLog(@"base64encoded : %@", result); return result; } - (NSString *)decryptDES:(NSString *)str { NSLog(@"decrypt input string : %@", str); NSData *decodedData = [NSData dataWithBase64EncodedString:str]; NSLog(@"data : %@", decodedData); NSLog(@"base64decoded : %s", [decodedData bytes]); unsigned char *input = (unsigned char*)[decodedData bytes]; NSUInteger inLength = [decodedData length]; NSInteger outLength = ((inLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1)); unsigned char *output =(unsigned char *)calloc(outLength, sizeof(unsigned char)); bzero(output, outLength*sizeof(unsigned char)); size_t additionalNeeded = 0; unsigned char *iv = (unsigned char *)calloc(kCCBlockSizeDES, sizeof(unsigned char)); bzero(iv, kCCBlockSizeDES * sizeof(unsigned char)); NSString *key = @"abcdefg123123123"; const void *vkey = (const void *) [key UTF8String]; CCCryptorStatus err = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding | kCCOptionECBMode, vkey, kCCKeySizeDES, iv, input, inLength, output, outLength, &additionalNeeded); NSLog(@"encrypt err: %d", err); if(0); else if (err == kCCParamError) NSLog(@"PARAM ERROR"); else if (err == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL"); else if (err == kCCMemoryFailure) NSLog(@"MEMORY FAILURE"); else if (err == kCCAlignmentError) NSLog(@"ALIGNMENT"); else if (err == kCCDecodeError) NSLog(@"DECODE ERROR"); else if (err == kCCUnimplemented) NSLog(@"UNIMPLEMENTED"); NSString *result; NSData *myData = [NSData dataWithBytesNoCopy:output NSLog(@"data : %@", myData); NSLog(@"decrypted string : %s", [myData bytes]); NSLog(@"decrypted length : %d", [myData length]); result = [NSString stringWithFormat:@"%.*s",[myData length], [myData bytes]]; NSLog(@"output length : %d", [result length]); NSLog(@"result : %@", result); return result; } /*************************************************************************************************/ |
사용 방법입니다.
우선 암호화를 진행할 곳에
#import <CommonCrypto/CommonCryptor.h>
이 해더파일을 import해주어야 합니다.
그리고 제가 첨부한 파일을 본인의 프로젝트에 추가시키고, 사용할 곳에서 마찬가지로
#import "NSDataAdditions.h"
해주셔야 합니다.
이유는 밑에서 설명하겠습니다.
그리고 함수를 적어주는건 말 할 필요도 없겠죠.
함수의 input은 string으로 들어갑니다. 물론 output도 string입니다.
NSData로 나오는걸 사용하기 편하도록 고쳐놓았습니다.
[self encryptDES:암호];
[self decryptDES:암호화된 스트링];
이런식으로 사용하면 되겠죠.
위의 함수는
암호화를 한 후 base64로 인코딩을 시킵니다.
base64로 인코딩하는 이유는 암호화가 된 문자열에 가끔 뒤에 쓰레기 값이 붙어 보일 수 있습니다.
이 쓰레기값을 처리할 수 있도록 base64로 비교적 보기 편한 문자열로 인코딩을 시키는 것이죠.
이거 때문에 제가 첨부한 파일들이 필요한겁니다.
이 함수들은
- 암호화
1. 문자열 입력
2. DES 암호화
3. 암호화된 문자열을 base64로 인코딩
- 복호화
1. 암호화되고 base64로 된 문자열 입력
2. base64를 UTF8로 암호화만 되어있는 문자열로 디코딩
3. 복호화
로 진행됩니다.
비밀키는
NSString *key = @"testtesttesttesttest";
이 부분입니다.
원하시는 문자열을 넣으시면 되겠죠.
'OBJECTIVE-C' 카테고리의 다른 글
[퍼옴]iOS: 카메라 기능 구현을 위한 UIImagePickerController Cook Book (0) | 2013.04.08 |
---|---|
애니메이션 효과 주기 (0) | 2013.01.31 |
[퍼옴]멀티스레드의 메모리관리에 관한 팁. (0) | 2013.01.22 |
AudioSession Dynamic Change (0) | 2012.09.24 |
iPhone Socket (0) | 2012.07.23 |