IPhone

문자열 암호화(DES)

Sunny's 2011. 5. 18. 19:35

저도 암호화 부분을 항상 고민해 오다가 이번 기회에 적용을 시켜 보았습니다.

카페에 있는 DES암호화는 왠지 적용이 안되는 부분이 있었습니다. 

암호화는 물론 복호화도 중요하겠죠.



우선 암호화 / 복호화 하는 함수를 알려드리겠습니다.

/*************************************************************************************************/
- (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 length:outLength freeWhenDone:YES];
NSData *myData = [NSData dataWithBytesNoCopy:output length:(NSUInteger)additionalNeeded freeWhenDone:YES];
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 dataWithBytes:(const void *)output length:(NSUInteger)additionalNeeded];
//NSData *myData = [NSData dataWithBytesNoCopy:output length:outLength freeWhenDone:YES];
NSData *myData = [NSData dataWithBytesNoCopy:output length:(NSUInteger)additionalNeeded freeWhenDone:YES];
NSLog(@"data : %@", myData);
NSLog(@"decrypted string : %s", [myData bytes]);
NSLog(@"decrypted length : %d", [myData length]);

result = [NSString stringWithFormat:@"%.*s",[myData length], [myData bytes]];
//result = [NSString stringWithUTF8String:[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";

이 부분입니다.

원하시는 문자열을 넣으시면 되겠죠.




그럼 도움이 되었으면 좋겠습니다.




아...파일을 첨부하니 대문자가 모두 소문자가 되어버리네요..

유의해주세요.

참조 :  http://cafe.naver.com/mcbugi