zoukankan      html  css  js  c++  java
  • iOS开发之Objectivec的AES256加密和解密算法的实现

    原文:http://www.lidaren.com/archives/1470
    高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。
    需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例
    
    原文:170987350
    密码:170
    Objective-c的AES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法
      1 //
      2 //NSData+AES256.h
      3 //
      4  
      5 #import <Foundation/Foundation.h>
      6 #import <CommonCrypto/CommonDigest.h>
      7 #import <CommonCrypto/CommonCryptor.h>
      8  
      9 @interface NSData(AES256)
     10 -(NSData *) aes256_encrypt:(NSString *)key;
     11 -(NSData *) aes256_decrypt:(NSString *)key;
     12 @end
     13  
     14  
     15 //
     16 //NSData+AES256.m
     17 //
     18 #import "NSData+AES256.h"
     19  
     20 @implementation NSData(AES256)
     21  
     22 - (NSData *)aes256_encrypt:(NSString *)key   //加密
     23 {
     24   char keyPtr[kCCKeySizeAES256+1];
     25   bzero(keyPtr, sizeof(keyPtr));
     26   [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
     27   NSUInteger dataLength = [self length];
     28   size_t bufferSize = dataLength + kCCBlockSizeAES128;
     29   void *buffer = malloc(bufferSize);
     30   size_t numBytesEncrypted = 0;
     31   CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
     32                       kCCOptionPKCS7Padding | kCCOptionECBMode,
     33                       keyPtr, kCCBlockSizeAES128,
     34                       NULL,
     35                       [self bytes], dataLength,
     36                       buffer, bufferSize,
     37                       &numBytesEncrypted);
     38   if (cryptStatus == kCCSuccess) {
     39     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
     40   }
     41   free(buffer);
     42   return nil;
     43 }
     44  
     45  
     46 - (NSData *)aes256_decrypt:(NSString *)key   //解密
     47 {
     48   char keyPtr[kCCKeySizeAES256+1];
     49   bzero(keyPtr, sizeof(keyPtr));
     50   [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
     51   NSUInteger dataLength = [self length];
     52   size_t bufferSize = dataLength + kCCBlockSizeAES128;
     53   void *buffer = malloc(bufferSize);
     54   size_t numBytesDecrypted = 0;
     55   CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
     56                       kCCOptionPKCS7Padding | kCCOptionECBMode,
     57                       keyPtr, kCCBlockSizeAES128,
     58                       NULL,
     59                       [self bytes], dataLength,
     60                       buffer, bufferSize,
     61                       &numBytesDecrypted);
     62   if (cryptStatus == kCCSuccess) {
     63     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
     64  
     65   }
     66   free(buffer);
     67   return nil;
     68 }
     69 @end
     70 2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h
     71 
     72  
     73 //
     74 //NSString +AES256.h
     75 //
     76  
     77 #import <Foundation/Foundation.h>
     78 #import <CommonCrypto/CommonDigest.h>
     79 #import <CommonCrypto/CommonCryptor.h>
     80  
     81 #import "NSData+AES256.h"
     82  
     83 @interface NSString(AES256)
     84  
     85 -(NSString *) aes256_encrypt:(NSString *)key;
     86 -(NSString *) aes256_decrypt:(NSString *)key;
     87  
     88 @end
     89  
     90  
     91 //
     92 //NSString +AES256.h
     93 //
     94  
     95 @implementation NSString(AES256)
     96  
     97 -(NSString *) aes256_encrypt:(NSString *)key
     98 {
     99   const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    100   NSData *data = [NSData dataWithBytes:cstr length:self.length];
    101   //对数据进行加密
    102   NSData *result = [data aes256_encrypt:key];
    103  
    104   //转换为2进制字符串
    105   if (result && result.length > 0) {
    106  
    107     Byte *datas = (Byte*)[result bytes];
    108     NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
    109     for(int i = 0; i < result.length; i++){
    110       [output appendFormat:@"%02x", datas[i]];
    111     }
    112     return output;
    113   }
    114   return nil;
    115 }
    116  
    117 -(NSString *) aes256_decrypt:(NSString *)key
    118 {   
    119   //转换为2进制Data
    120   NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];
    121   unsigned char whole_byte;
    122   char byte_chars[3] = {'\0','\0','\0'};
    123   int i;
    124   for (i=0; i < [self length] / 2; i++) {
    125     byte_chars[0] = [self characterAtIndex:i*2];
    126     byte_chars[1] = [self characterAtIndex:i*2+1];
    127     whole_byte = strtol(byte_chars, NULL, 16);
    128     [data appendBytes:&whole_byte length:1];
    129   }
    130  
    131   //对数据进行解密
    132   NSData* result = [data aes256_decrypt:key];
    133   if (result && result.length > 0) {
    134     return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    135   }
    136   return nil;
    137 }
    138 @end
  • 相关阅读:
    产品经理的未来在哪里
    如何打造一款成功的产品
    彻底解决Android 应用方法数不能超过65K的问题
    MVC,MVP 和 MVVM 的图示
    oracle最高账号sys的密码认证模式
    Android开发者必须深入学习的10个应用开源项目
    Android程序完全退出的三种方法
    Android-监听网络状态
    Android开发图片分辨率问题解决方案
    Android清除本地数据缓存代码
  • 原文地址:https://www.cnblogs.com/qq744890760/p/5072220.html
Copyright © 2011-2022 走看看