最近的项目中数据传输用到加密,项目选择了AES128 CBC No Padding加密方式,PHP和Android方面的代码网上太多了。但是唯独没有iOS的,但是也有别的写法,但不是是AES128 CBC No Padding或者不是CBC No Padding。自己仿照着写了个,不过PHP端总是解密不出。问题就处在No Padding. No Pading的情况下,一定要对加密数据不是kCCKeySizeAES128倍数部分进行0x0000的填充,不然加密长度不正确,一般情况下选择使用kCCOptionPKCS7Padding(也就是0x0001)进行填充,但是我们是No Padding所以要用0x0000填充。加密后再对加密数据进行了Base64加密,用到了google的GTMBase64,没有的网上自己找,下面上ios的代码:

DES3Util.h内容

//
// DES3Util.h
// JuziAnalyticsDemo
//
// Created by wanyakun on 13-6-6.
// Copyright (c) 2013年 The9. All rights reserved.
// #import <Foundation/Foundation.h> @interface DES3Util : NSObject + (NSString*) AES128Encrypt:(NSString *)plainText; + (NSString*) AES128Decrypt:(NSString *)encryptText; @end

DES3Util.m文件内容

//
// DES3Util.m
// JuziAnalyticsDemo
//
// Created by wanyakun on 13-6-6.
// Copyright (c) 2013年 The9. All rights reserved.
// #import "DES3Util.h"
#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h" #define gkey @"16位长度的字符串" //自行修改
#define gIv @"16位长度的字符串" //自行修改 @implementation DES3Util +(NSString *)AES128Encrypt:(NSString *)plainText
{
char keyPtr[kCCKeySizeAES128+1];
memset(keyPtr, 0, sizeof(keyPtr));
[gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128+1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length]; int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
int newSize = 0; if(diff > 0)
{
newSize = dataLength + diff;
} char dataPtr[newSize];
memcpy(dataPtr, [data bytes], [data length]);
for(int i = 0; i < diff; i++)
{
dataPtr[i + dataLength] = 0x00;
} size_t bufferSize = newSize + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
memset(buffer, 0, bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
0x0000, //No padding
keyPtr,
kCCKeySizeAES128,
ivPtr,
dataPtr,
sizeof(dataPtr),
buffer,
bufferSize,
&numBytesCrypted); if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
return [GTMBase64 stringByEncodingData:resultData];
}
free(buffer);
return nil;
} +(NSString *)AES128Decrypt:(NSString *)encryptText
{
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize); size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
0x0000,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[data bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];
}
free(buffer);
return nil;
} @end

最新文章

  1. 【Matplotlib】图例分开显示
  2. iOS 利用Socket UDP协议广播机制的实现
  3. Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹
  4. json 序列化和反序列化
  5. Android:ListViewAdapter
  6. 点击截图功能 js canvas
  7. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解
  8. 零基础怎么学java
  9. Vue 随机分配的打扫卫生H5 :打扫让我快乐
  10. 2、CentOS下编译安装Python2.7.6(转)
  11. JavaScript按纯数字排序
  12. Linux内核读书笔记第三周 调试
  13. Using Android Phone to recover SD card formatted with DD command under linux
  14. MT【223】二次函数最大最小
  15. 03 Zabbix4.0添加cisco交换机基本监控步骤
  16. C++ virtual函数重写,在继承的时候没有在函数前写virtual关键字也依然是虚函数吗?
  17. 关于Linux系统指令 top 之 %si 占用高,分析实例一
  18. django Form的回顾--手动档和自动挡
  19. rabbitmq .erlang.cookie文件疑惑
  20. 理解webpack4.splitChunks之maxAsyncRequests

热门文章

  1. redux相关专业名词及函数提要
  2. vue 选项卡(转载)
  3. RFC 8446
  4. Support for SSL/TLS protocols on Windows
  5. Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
  6. VIM 命令收藏
  7. STM32CubeMX介绍、下载与安装
  8. 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp
  9. springmvc+json 前后台数据交互
  10. 适用于Rick的奖惩体系