iPhone程序中的加密处理

  • 原文链接 : http://www.yifeiyang.net/iphone-development-techniques-of-data-papers-2-iphone-encryption-program/
  • CCCrypt
    base64encoding

    iPhone开发技巧之数据篇(2)—iPhone程序中的加密处理

    CCCrypt

    在Objective-C语言中,加密时常用到CCCrypt(3cc)Mac OS X Manual Page。下面的代码使用 CCCrypt() ,给 NSData 类增加了AES256EncryptWithKey, AES256DecryptWithKey 方法.

    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
    
    #import <CommonCrypto/CommonCryptor.h> @implementation NSData (Additions) @class NSString; - (NSData *)AES256EncryptWithKey:(NSString *)key { char keyPtr[kCCKeySizeAES256+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); return nil; } - (NSData *)AES256DecryptWithKey:(NSString *)key { char keyPtr[kCCKeySizeAES256+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesDecrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); return nil; } @end
    
     

    使用的时候就像使用NSData一样。

    base64encoding

    有的时候需要向服务器上传递base64加密的数据,这个时候我们就可以像下面,给 NSData类追加newStringInBase64FromData 方法。

    1
    
    2
    
    3
    
    4
    
    5
    
    6
    
    7
    
    8
    
    9
    
    10
    
    11
    
    12
    
    13
    
    14
    
    15
    
    16
    
    17
    
    18
    
    19
    
    20
    
    21
    
    - (NSString *)newStringInBase64FromData { NSMutableString *dest = [[NSMutableString alloc] initWithString:@""]; unsigned char * working = (unsigned char *)[self bytes]; int srcLen = [self length]; for (int i=0; i<srcLen; i += 3) { for (int nib=0; nib<4; nib++) { int byt = (nib == 0)?0:nib-1; int ix = (nib+1)*2; if (i+byt >= srcLen) break; unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F); if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F); [dest appendFormat:@"%c", base64[curr]]; } } return dest; }
    
     

    同样,使用的时候就像使用NSData一样。

    最终的代码如下所示 :

    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
    
    //
    
    //  NSDataAdditions.h
    
    //
    
    //  Copyright 2010 __MyCompanyName__. All rights reserved.
    
    //
    
    
    
    #import <Foundation/Foundation.h>  @class NSString; @interface NSData (Additions) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; - (NSString *)newStringInBase64FromData; @end // ----------------------------------------------------------------------------------- // // NSDataAdditions.m // // Copyright 2010 __MyCompanyName__. All rights reserved. // #import "NSDataAdditions.h" #import <CommonCrypto/CommonCryptor.h>  static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @implementation NSData (Additions) @class NSString; - (NSData *)AES256EncryptWithKey:(NSString *)key {  char keyPtr[kCCKeySizeAES256+1];  bzero(keyPtr, sizeof(keyPtr));  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  NSUInteger dataLength = [self length];  size_t bufferSize = dataLength + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);  size_t numBytesEncrypted = 0;  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,            kCCOptionPKCS7Padding | kCCOptionECBMode,            keyPtr, kCCBlockSizeAES128,            NULL,            [self bytes], dataLength,            buffer, bufferSize,            &numBytesEncrypted);  if (cryptStatus == kCCSuccess) {   return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  }  free(buffer);  return nil; } - (NSData *)AES256DecryptWithKey:(NSString *)key {  char keyPtr[kCCKeySizeAES256+1];  bzero(keyPtr, sizeof(keyPtr));  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  NSUInteger dataLength = [self length];  size_t bufferSize = dataLength + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);  size_t numBytesDecrypted = 0;  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,            kCCOptionPKCS7Padding | kCCOptionECBMode,            keyPtr, kCCBlockSizeAES128,            NULL,            [self bytes], dataLength,            buffer, bufferSize,            &numBytesDecrypted);  if (cryptStatus == kCCSuccess) {   return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  }  free(buffer);  return nil; } - (NSString *)newStringInBase64FromData {  NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];  unsigned char * working = (unsigned char *)[self bytes];  int srcLen = [self length];  for (int i=0; i<srcLen; i += 3) {   for (int nib=0; nib<4; nib++) {    int byt = (nib == 0)?0:nib-1;    int ix = (nib+1)*2;    if (i+byt >= srcLen) break;    unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F);    if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F);    [dest appendFormat:@"%c", base64[curr]];   }  }  return dest; } @end
    

你可能感兴趣的:(加密,null,iPhone,Class,buffer,encoding)