美文网首页
3DES加解密-iOS

3DES加解密-iOS

作者: 法拉达 | 来源:发表于2017-04-17 21:54 被阅读96次

    最近公司需要对url明文加密,经过讨论后使用了3DES加密

    1.首先需要导入GTMBase64开源框架库

    2.KCCEncrypt是加密,KCCDecrypt是解密,kCCAlgorithm3DES是加密方式(还有des,aes),设置好加密密匙。封装好后是下面这个样子:

    #import "NSString+ThreeDES.h"

    #import 

    #import 

    #import "GTMBase64.h"

    @implementation NSString (KDS_ThreeDES)

    #pragma mark- 3des加密

    + (NSString*)getEncryptWithString:(NSString *)encryptString keyString:(NSString *)keyString ivString:(NSString *)ivString{

    return [self encrypt:encryptString keyString:keyString ivString:ivString operation:kCCEncrypt];

    }

    #pragma mark- 3des解密

    + (NSString*)getDecryptWithString:(NSString *)decryptString keyString:(NSString *)keyString ivString:(NSString *)ivString{

    return [self encrypt:decryptString keyString:keyString ivString:ivString operation:kCCDecrypt];

    }

    +(NSString *) encrypt:(NSString*)plainText keyString:(NSString*)keyString ivString:(NSString*)ivString operation:(CCOperation)encryptOrDecrypt

    {

    const void * vplainText;

    size_t plainTextBufferSize;

    if (encryptOrDecrypt== kCCDecrypt)

    {

    NSData * EncryptData = [GTMBase64 decodeData:[plainText

    dataUsingEncoding:NSUTF8StringEncoding]];

    plainTextBufferSize= [EncryptData length];

    vplainText = [EncryptData bytes];

    }

    else

    {

    NSData * tempData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

    plainTextBufferSize= [tempData length];

    vplainText = [tempData bytes];

    }

    CCCryptorStatus ccStatus;

    uint8_t * bufferPtr = NULL;

    size_t bufferPtrSize = 0;

    size_t movedBytes = 0;

    // uint8_t ivkCCBlockSize3DES;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES)

    &~(kCCBlockSize3DES- 1);

    bufferPtr = malloc(bufferPtrSize* sizeof(uint8_t));

    memset((void*)bufferPtr,0x0, bufferPtrSize);

    NSString * key = keyString;

    NSString * initVec = ivString;

    const void * vkey= (const void *)[key UTF8String];

    const void * vinitVec= (const void *)[initVec UTF8String];

    uint8_t iv[kCCBlockSize3DES];

    memset((void*) iv,0x0, (size_t)sizeof(iv));

    ccStatus = CCCrypt(encryptOrDecrypt,

    kCCAlgorithm3DES,//加密方式

    kCCOptionPKCS7Padding,

    vkey,////3des加密密钥, //key

    kCCKeySize3DES,

    vinitVec,//3des加密密钥, //iv,

    vplainText,//plainText,

    plainTextBufferSize,

    (void*)bufferPtr, // 注意接收加密的buffer的大小

    bufferPtrSize,

    &movedBytes);

    //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");

    if (ccStatus== kCCParamError) return @"PARAM ERROR";

    else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";

    else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";

    else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";

    else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";

    else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";

    NSString * result;

    if (encryptOrDecrypt== kCCDecrypt)

    {

    result = [[NSString alloc] initWithData:[NSData

    dataWithBytes:(const void *)bufferPtr

    length:(NSUInteger)movedBytes]

    encoding:NSUTF8StringEncoding];

    ;

    }

    else

    {

    NSData * myData =[NSData dataWithBytes:(const void *)bufferPtr

    length:(NSUInteger)movedBytes];

    result = [GTMBase64 stringByEncodingData:myData];

    }

    return result;

    }

    @end

    相关文章

      网友评论

          本文标题:3DES加解密-iOS

          本文链接:https://www.haomeiwen.com/subject/wolxzttx.html