底层给得key是:static uint8 AesKey[16]={0x01,0x02,0x03,0x04,0x05,0,0x07,0,0x09,0x10,0,0x12,0,0x14,0,0x16};
网上找的大多是传入字符串类型的key,而我这里把传入的key 从字节数组转为nsdata类型,将网上的代码略作修改,最后解密成功。以下贴代码
#import <Foundation/Foundation.h>
@class NSString;
@interface NSData (Encryption)
- (NSData *)AES128EncryptWithKey:(NSString *)key; //加密
- (NSData *)AES128DecryptWithKey:(NSData *)key; //解密
@end
#import "NSData+AES.h"
#import <CommonCrypto/CommonCryptor.h>
#define gIv nil //可以自行修改
@implementation NSData (Encryption)
//(key和iv向量这里是16位的) 这里是CBC加密模式,安全性更高
- (NSData *)AES128EncryptWithKey:(NSString *)key {//加密
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCKeySizeAES128+1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
- (NSData *)AES128DecryptWithKey:(NSData *)key {//解密
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
// [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
[key getBytes:keyPtr length:kCCKeySizeAES128+1];//此处方法为修改的方法,上面这一句注释掉得方法不适用这里
char ivPtr[kCCKeySizeAES128+1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
@end
+(NSString*)decryptAESData:(NSData*)data app_key:(NSData *)key
{
//使用密码对data进行解密
NSData *decryData = [data AES128DecryptWithKey:key];
NSLog(@"%s/n",[[decryData description] UTF8String]);
//将解了密码的nsdata转化为nsstring
NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
return [str autorelease];
}
//下面是调用方法
NSData *txp = data.object;
static UInt8 AesKey[16]={0x01,0,0x03,0,0x05,0,0x07,0,0x09,0x10,0,0x12,0,0x14,0,0x16};
NSData *data2 = [NSData dataWithBytes:AesKey length:16];//这是关键更改,key不是字符串 key是data2
NSString * string2 = [SecurityUtil decryptAESData:txp app_key:data2];