关于iOS中AES加密和base64编码的理解

AES算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。经过对DES 算法和AES 算法的比较分析,我们可以得出结论后者的效率明显高于前者而且由于AES 算法的简洁性,使得它的实现更为容易。AES 作为新一代的数据加密标准其安全性也远远高于DES 算法。更为重要的是,AES 算法硬件实现的速度大约是软件实现的3这就给用硬件实现加密提供了很好的机会下面我就讲下AES的用法

1.可以先封装个NSData+AES128的类。

在.m里实现加密和解密两个方法

- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv

{

    return [self AES128Operation:kCCEncrypt key:key iv:iv];

}


- (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv

{

    return [self AES128Operation:kCCDecrypt key:key iv:iv];

}


- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv

{

    //一个char数组,kCCKeySizeAES128 16

    char keyPtr[kCCKeySizeAES128 + 1];

    //把数组全部设置为0

    memset(keyPtr, 0, sizeof(keyPtr));

    //NSString存放到字符数组里面,字符数组最多是16

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    

    //创建一个字符数组,kCCBlockSizeAES128 16

    char ivPtr[kCCBlockSizeAES128 + 1];

    //把字符数组全部值为 0

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

    //NSString 放进字符数组里面,最多16 17位的话,最后一个不晓得要不要存放"\0"

    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

    

    //取出要加密的数据的长度

    NSUInteger dataLength = [self length];

    //把该长度加上 kCCBlockSizeAES128 16

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    //从内存中开辟一个bufferSize大小的空间,指针给buffer void * 任意类型

    void * buffer = malloc(bufferSize);

    

    //numBytesCrypted 接收加密解密后的数据的长度

    size_t numBytesCrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(operation,

                                          kCCAlgorithmCAST,

                                          kCCOptionPKCS7Padding,

                                          keyPtr,

                                          kCCBlockSizeAES128,

//                                          kCCKeySizeAES256,

//                                          kCCKeySize3DES,

                                          ivPtr,

                                          [self bytes],

                                          dataLength,

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    if (cryptStatus == kCCSuccess)

    {

        //注意,此时的buffer是一个局部变量

        NSData * cryptData=[NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

        //这里的buffer没有free

        return cryptData;

    }

    //buffermalloc出来的,要释放掉

    free(buffer);

    return nil;

}


2.在单独封装个base64的类。 实现base64编码


+ (NSData*) decode:(const char*) string length:(NSInteger) inputLength

{

    //如果字符串为空,或者长度不是4的整数倍,直接返回空。

    if ((string == NULL) || (inputLength % 4 != 0)) {

        return nil;

    }

    //去掉字符串后面的所有

    while (inputLength > 0 && string[inputLength - 1] == '=') {

        inputLength--;

    }

    

    NSInteger outputLength = inputLength * 3 / 4;

    NSMutableData* data = [NSMutableData dataWithLength:outputLength];

    uint8_t* output = data.mutableBytes;

    

    NSInteger inputPoint = 0;

    NSInteger outputPoint = 0;

    while (inputPoint < inputLength)

    {

        char i0 = string[inputPoint++];

        char i1 = string[inputPoint++];

        char i2 = inputPoint < inputLength ? string[inputPoint++] : 'A';

        char i3 = inputPoint < inputLength ? string[inputPoint++] : 'A';

        output[outputPoint++] = (DecodingTable[i0] << 2) | (DecodingTable[i1] >> 4);

        if (outputPoint < outputLength)

        {

            output[outputPoint++] = ((DecodingTable[i1] & 0xf) << 4) | (DecodingTable[i2] >> 2);

        }

        if (outputPoint < outputLength)

        {

            output[outputPoint++] = ((DecodingTable[i2] & 0x3) << 6) |DecodingTable[i3];

        }

    }

    return data;

}

3.现在就可以在其他类中直接调用该方法

//字符串转换成NSData

    NSData * pData=[password dataUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"-----%@",pData);

    //pData进行加密得到加密后的NSData

    NSData * encryptData=[pData AES128EncryptWithKey:@"haha" iv:@"hehe"];

    NSLog(@"aaaa%@",encryptData);

    //把加密之后的NSData进行base64编码转换成字符串。

    NSString * encryptStr=[Base64Encode base64StrFromData:encryptData];

    NSLog(@"bbbb%@",encryptStr);

    NSData * thedata=[Base64Encode dataFromBase64Str:encryptStr];

    NSLog(@"eeee%@",thedata);

    

    //encryptData进行解密,得到解密后的NSData

    NSData * decryptData=[encryptData AES128DecryptWithKey:@"haha" iv:@"hehe"];

    NSLog(@"%@",decryptData);

    //

    NSString * decryptStr=[[NSString alloc]initWithData:decryptData encoding:NSUTF8StringEncoding];

    NSLog(@"%@",decryptStr);





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值