• iOS AES128加密解密


    有个项目用过AES128 (CBC)的加密,当时搜索了很久的资料,基本不能使用。这里我自己写了一个可以用的  代码如下:

    (PS:这个方法写的还有些瑕疵 不过已经足够正常使用了,有机会的话 会写的好看一点。。。转发要标注出处哦)

    这是.h 

     1 //
     2 //  AES128CBC_No_Padding_Unit.h
     3 // 
     4 //
     5 //  Created by apple on 14-5-13.
     6 //  Copyright (c) 2014年 akforsure. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 @interface AES128CBC_No_Padding_Unit : NSObject
    12 /**
    13  *  AES128加密
    14  *
    15  *  @param plainText 原文
    16  *
    17  *  @return 加密好的字符串
    18  */
    19 + (NSString *)AES128Encrypt:(NSString *)plainText;
    20 /**
    21  *  AES128解密
    22  *
    23  *  @param encryptText 密文
    24  *
    25  *  @return 明文
    26  */
    27 + (NSString *)AES128Decrypt:(NSString *)encryptText;
    28 @end

    这是.m

      1 //
      2 //  AES128CBC_No_Padding_Unit.m
      3 // 
      4 //
      5 //  Created by apple on 14-5-13.
      6 //  Copyright (c) 2014年 akforsure. All rights reserved.
      7 //
      8 
      9 #import "AES128CBC_No_Padding_Unit.h"
     10 #import <CommonCrypto/CommonCryptor.h>
     11 #import "GTMBase64.h"
     12 @implementation AES128CBC_No_Padding_Unit
     13 + (NSString *)AES128Encrypt:(NSString *)plainText
     14 {
     15     char keyPtr[kCCKeySizeAES128+1];
     16     memset(keyPtr, 0, sizeof(keyPtr));
     17     [AESKEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
     18     
     19     char ivPtr[kCCBlockSizeAES128+1];
     20     memset(ivPtr, 0, sizeof(ivPtr));
     21     [AESIV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
     22     
     23     NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
     24     NSUInteger dataLength = [data length];
     25     
     26     int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
     27     int newSize = 0;
     28     
     29     if(diff > 0)
     30     {
     31         newSize = dataLength + diff;
     32     }
     33     
     34     char dataPtr[newSize];
     35     memcpy(dataPtr, [data bytes], [data length]);
     36     for(int i = 0; i < diff; i++)
     37     {
     38         dataPtr[i + dataLength] = 0x00;
     39     }
     40     
     41     size_t bufferSize = newSize + kCCBlockSizeAES128;
     42     void *buffer = malloc(bufferSize);
     43     memset(buffer, 0, bufferSize);
     44     
     45     size_t numBytesCrypted = 0;
     46     
     47     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
     48                                           kCCAlgorithmAES128,
     49                                           0x0000,   //这里用的 NoPadding的填充方式
     50                                                     //除此以外还有 kCCOptionPKCS7Padding 和 kCCOptionECBMode
     51                                           keyPtr,
     52                                           kCCKeySizeAES128,
     53                                           ivPtr,
     54                                           dataPtr,
     55                                           sizeof(dataPtr),
     56                                           buffer,
     57                                           bufferSize,
     58                                           &numBytesCrypted);
     59     
     60     if (cryptStatus == kCCSuccess) {
     61         NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
     62         return [GTMBase64 stringByEncodingData:resultData];
     63     }
     64     free(buffer);
     65     return nil;
     66 }
     67 
     68 + (NSString *)AES128Decrypt:(NSString *)encryptText
     69 {
     70     char keyPtr[kCCKeySizeAES128 + 1];
     71     memset(keyPtr, 0, sizeof(keyPtr));
     72     [AESKEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
     73     
     74     char ivPtr[kCCBlockSizeAES128 + 1];
     75     memset(ivPtr, 0, sizeof(ivPtr));
     76     [AESIV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
     77     
     78     NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
     79     NSUInteger dataLength = [data length];
     80     size_t bufferSize = dataLength + kCCBlockSizeAES128;
     81     void *buffer = malloc(bufferSize);
     82     
     83     size_t numBytesCrypted = 0;
     84     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
     85                                           kCCAlgorithmAES128,
     86                                           0x0000,
     87                                           keyPtr,
     88                                           kCCBlockSizeAES128,
     89                                           ivPtr,
     90                                           [data bytes],
     91                                           dataLength,
     92                                           buffer,
     93                                           bufferSize,
     94                                           &numBytesCrypted);
     95     if (cryptStatus == kCCSuccess) {
     96         NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
     97         return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];
     98     }
     99     free(buffer);
    100     return nil;
    101 }
    102 
    103 @end
  • 相关阅读:
    使用Selector改变TextView的字体颜色textColor的方法
    ViewPager中Fragment切换过程不被销毁的方法
    TextView属性android:ellipsize="marquee"不生效的解决办法
    Android中用TextView显示大量文字的方法
    Android基础学习第三篇—Intent的用法
    Android Studio中Button等控件的Text中字符串默认大写的解决方法
    Android Studio一些常用快捷键及快捷键冲突解决
    Android基础学习第二篇—Activity
    Android基础学习第一篇—Project目录结构
    MVC5 A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' or 'http://schemas.microsoft.com/accesscontrolservice/2
  • 原文地址:https://www.cnblogs.com/akforsure/p/4432730.html
Copyright © 2020-2023  润新知