• iPhone程序中的加密处理


    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650478
     
     
    • 原文链接 : http://www.yifeiyang.net/iphone-development-techniques-of-data-papers-2-iphone-encryption-program/
    • 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
  • 相关阅读:
    TP自适应
    消息编解码Nanopb
    协程coroutine
    gui设计
    常用小工具集
    在github上新建一个仓库并上传本地工程
    通用定时器设计(2)
    通用定时器设计(1)
    嵌入式驱动程序设计
    meta标签的理解
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3601807.html
Copyright © 2020-2023  润新知