iOS AES解密 我遇到的问题

底层给得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)


//(keyiv向量这里是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];



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值