2018-06-01AES加密

我们在传递敏感数据是,需要对data进行加密。我们采用高AES 128位加密。加密模式采用CBC,填充模式采用PKCS5Padding方式。

+(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];

    NSIntegerdataLength = [datalength];

    NSInteger diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);

    NSIntegernewSize =0;

    if(diff >0)

    {

        newSize = dataLength + diff;

    }

    chardataPtr[newSize];

    memcpy(dataPtr, [databytes], [datalength]);

    for(inti =0; i < diff; i++)

    {

        dataPtr[i + dataLength] =0x00;

    }

    size_tbufferSize = newSize +kCCBlockSizeAES128;

    void*buffer =malloc(bufferSize);

    memset(buffer,0, bufferSize);

    size_tnumBytesCrypted =0;

    CCCryptorStatuscryptStatus =CCCrypt(kCCEncrypt,

                                          kCCAlgorithmAES128,

                                          0x0000|kCCOptionPKCS7Padding,              //PKCS7Padding

                                          keyPtr,

                                          kCCKeySizeAES128,

                                          ivPtr,

                                          dataPtr,

                                          sizeof(dataPtr),

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    if(cryptStatus ==kCCSuccess) {

        NSData*resultData = [NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];

        return[GTMBase64stringByEncodingData:resultData];

    }

    free(buffer);

    return nil;

}

+(NSString*)AES128Decrypt:(NSString*)encryptText

{

    charkeyPtr[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]];

    NSUIntegerdataLength = [datalength];

    size_tbufferSize = dataLength +kCCBlockSizeAES128;

    void*buffer =malloc(bufferSize);

    size_tnumBytesCrypted =0;

    CCCryptorStatuscryptStatus =CCCrypt(kCCDecrypt,

                                          kCCAlgorithmAES128,

                                          0x0000|kCCOptionPKCS7Padding,

                                          keyPtr,

                                          kCCBlockSizeAES128,

                                          ivPtr,

                                          [databytes],

                                          dataLength,

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    if(cryptStatus ==kCCSuccess) {

        NSData*resultData = [NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];

        return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];

    }

    free(buffer);

    return nil;

}

以上为加密和解密的方法。其中gkey和gIv为秘钥和偏移量。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 8,150评论 0 7
  • AES加密 之前公司项目有需要用到这个加密,但是由于网络上找到的都是没有设置向量的,所以后来进行整理之后,自己写了...
    宁小缺阅读 8,593评论 9 3
  • DEMO 综述: 一行代码完成AES加密,加密模式 AES128 + ECB + NoPadding DEMO下载...
    iccpeng阅读 12,751评论 26 59
  • 首先罗列一些知识点: 1.加密算法通常分为对称性加密算法和非对称性加密算法:对于对称性加密算法,信息接收双方都需事...
    JonesCxy阅读 5,278评论 2 4
  • 引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在androi...
    freesan44阅读 4,840评论 1 1