iOS AES解密 我遇到的问题

来源:互联网 发布:java实现aes加密 编辑:程序博客网 时间:2024/06/07 06:58

底层给得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:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

    

    char ivPtr[kCCKeySizeAES128+1];

   memset(ivPtr, 0,sizeof(ivPtr));

    [gIvgetCString:ivPtr maxLength:sizeof(ivPtr)encoding:NSUTF8StringEncoding];

    

   NSUInteger dataLength = [selflength];

   size_t bufferSize = dataLength + kCCBlockSizeAES128;

   void *buffer = malloc(bufferSize);

   size_t numBytesEncrypted = 0;

   CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

                                         kCCAlgorithmAES128,

                                         kCCOptionECBMode,

                                          keyPtr,

                                         kCCBlockSizeAES128,

                                          ivPtr,

                                          [selfbytes],

                                          dataLength,

                                          buffer,

                                          bufferSize,

                                          &numBytesEncrypted);

   if (cryptStatus == kCCSuccess) {

       return [NSDatadataWithBytesNoCopy: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:keyPtrlength:kCCKeySizeAES128+1];//此处方法为修改的方法,上面这一句注释掉得方法不适用这里

    

    char ivPtr[kCCKeySizeAES128+1];

   memset(ivPtr, 0,sizeof(ivPtr));

    [gIvgetCString:ivPtr maxLength:sizeof(ivPtr)encoding:NSUTF8StringEncoding];

    

   NSUInteger dataLength = [selflength];

   size_t bufferSize = dataLength + kCCBlockSizeAES128;

   void *buffer = malloc(bufferSize);

   size_t numBytesDecrypted = 0;

   CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

                                         kCCAlgorithmAES128,

                                         kCCOptionECBMode,

                                          keyPtr,

                                         kCCBlockSizeAES128,

                                          ivPtr,

                                          [selfbytes],

                                          dataLength,

                                          buffer,

                                          bufferSize,

                                          &numBytesDecrypted);

   if (cryptStatus == kCCSuccess) {

       return [NSDatadataWithBytesNoCopy: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",[[decryDatadescription] UTF8String]);

    //将解了密码的nsdata转化为nsstring

    NSString *str = [[NSStringalloc] initWithData:decryDataencoding: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 = [NSDatadataWithBytes:AesKey length:16];//这是关键更改,key不是字符串 key是data2

NSString * string2 = [SecurityUtildecryptAESData:txp app_key:data2];



0 0
原创粉丝点击