iOS 以byte数组作为密钥的3des加密

来源:互联网 发布:js设置innerhtml 编辑:程序博客网 时间:2024/06/05 08:54

最近做3des加密的时候,服务器返回的byte数组作为密钥,网上的方法都是以字符串作为密钥。先将字符串进行utf8编码,再转换成data,这样和直接用byte数组进行加密是有区别的,转换后的data字节数增加了一倍,这时候怎么办呢?

首先 对密钥字符串进行处理,把16进制字符串转换为byte数组(nadata)

- (NSData *) stringToHexData{    int len = [self length] / 2;    // Target length    unsigned char *buf = malloc(len);    unsigned char *whole_byte = buf;    char byte_chars[3] = {'\0','\0','\0'};    int i;    for (i=0; i < [self length] / 2; i++) {        byte_chars[0] = [self characterAtIndex:i*2];        byte_chars[1] = [self characterAtIndex:i*2+1];        *whole_byte = strtol(byte_chars, NULL, 16);        whole_byte++;    }    NSData *data = [NSData dataWithBytes:buf length:len];    free( buf );    return data;}

这样就得到了data的密钥,然后进行3des加密

+(NSString*)TripleDES:(NSString*)plainText  andCCOperation:(CCOperation )encryptOrDecrypt  anddata:(NSData*)data{    const void *vplainText;    size_t plainTextBufferSize;    if (encryptOrDecrypt == kCCDecrypt)//解密    {        NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];        plainTextBufferSize = [EncryptData length];        vplainText = [EncryptData bytes];    }    else //加密    {        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];        plainTextBufferSize = [data length];        vplainText = (const void *)[data bytes];    }    CCCryptorStatus ccStatus;    uint8_t *bufferPtr = NULL;    size_t bufferPtrSize = 0;    size_t movedBytes = 0;    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));    memset((void *)bufferPtr, 0x0, bufferPtrSize);    // memset((void *) iv, 0x0, (size_t) sizeof(iv));    //const void *vkey = (const void *)[DESKEY UTF8String];    const void *vkey = (const void *)[data bytes];    // NSString *initVec = @"init Vec";    //const void *vinitVec = (const void *) [initVec UTF8String];    //  Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};    ccStatus = CCCrypt(encryptOrDecrypt,                       kCCAlgorithm3DES,                       kCCOptionPKCS7Padding | kCCOptionECBMode,                       vkey,                       kCCKeySize3DES,                       nil,                       vplainText,                       plainTextBufferSize,                       (void *)bufferPtr,                       bufferPtrSize,                       &movedBytes);       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;}

ok,这样就可以得到加密后的结果了

0 0