DES암호화

컴퓨터/아이폰 : 2011. 6. 24. 14:05


죄송합니다. 

input과 output의 문자열이 다른 오류(NSData에 쓰레기값이 체워지는 버그)가 발견되어

후다닥 수정하여 올립니다.






암호화 관련으로 이야기가 많은거 같더군요.

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

카페에 있는 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");
free(iv);

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");
free(iv);

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";

이 부분입니다.

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




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




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

유의해주세요.

'컴퓨터 > 아이폰' 카테고리의 다른 글

아이폰 다음버전 출시설..ㅋ  (0) 2011.06.24
UIWebView와 Application(App) 간의 통신  (0) 2011.06.24
push notification  (0) 2011.06.24
나침반 소스  (0) 2011.06.24
local notification  (0) 2011.06.14
      
Posted by k_ben