ios AES128加密解密算法

来源:互联网 发布:淘宝售后的服务流程 编辑:程序博客网 时间:2024/05/01 14:49



闲话不多说 直接上代码:


加密:

+(NSString *)AES128Encrypt:(NSString *)plainText

{

    //    int kCCKeySizeAES128;

    //    int kCCBlockSizeAES128;

    

    

    char keyPtr[kCCKeySizeAES128+1];

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

    [gkeygetCString:keyPtr maxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

    

    char ivPtr[kCCBlockSizeAES128+1];

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

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

    

    NSData* data = [plainTextdataUsingEncoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    

    int diff =kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);

    int newSize = 0;

    

    if(diff > 0)

    {

        newSize = dataLength + diff;

    }

    

//    char dataPtr[newSize];

    Byte dataPtr[newSize];

    memcpy(dataPtr, [data bytes], [data length]);

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

    {

        dataPtr[i + dataLength] = 0x00;

    }

    

    size_t bufferSize = newSize + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    memset(buffer, 0, bufferSize);

    

    size_t numBytesCrypted = 0;

    

  NSString *key = SERVICE_key;

    

    NSData *testData = [[keymd5HexDigest] dataUsingEncoding:NSUTF8StringEncoding];


    Byte *testByte = (Byte *)[testDatabytes];



    

    Byte keyByte[16];

    

    for(int i=8;i<[testDatalength];i++){

        

        if (i==24) {

            break;

        }

//        NSLog(@"testByte = %d\n",testByte[i]);

        keyByte[i-8]=testByte[i];

        

    }

    


    

    CCCryptorStatus cryptStatus =CCCrypt(kCCEncrypt,

                                          kCCAlgorithmAES128,

                                          0X0000,              //No padding

                                          keyByte,

                                          kCCKeySizeAES128,

                                          ivPtr,

                                          dataPtr ,

                                          sizeof(dataPtr),

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    


        if (cryptStatus == kCCSuccess) {

        NSData *resultData = [NSDatadataWithBytesNoCopy:buffer length:numBytesCrypted];

        return [GTMBase64NewstringByEncodingData:resultData];

    }

    free(buffer);

    return nil;

}


解密

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

{

    char keyPtr[kCCKeySizeAES128 +1];

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

    [gkeygetCString:keyPtr maxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

    

    char ivPtr[kCCBlockSizeAES128 +1];

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

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

    

    NSData *data = [GTMBase64NewdecodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];

    NSUInteger dataLength = [data length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    

    size_t numBytesCrypted = 0;

//    NSData *testData = [gkey dataUsingEncoding: NSUTF8StringEncoding];


  NSString *key = SERVICE_key;


    NSData *testData = [[keymd5HexDigest] dataUsingEncoding:NSUTF8StringEncoding];

    

    Byte *testByte = (Byte *)[testDatabytes];


    

    Byte keyByte[16];

    

    for(int i=8;i<[testDatalength];i++){

        

        if (i==24) {

            break;

        }

        keyByte[i-8]=testByte[i];

        

    }

    

    

    CCCryptorStatus cryptStatus =CCCrypt(kCCDecrypt,

                                          kCCAlgorithmAES128,

                                          0X0000,

                                          keyByte,

                                          kCCKeySizeAES128,

                                          ivPtr,

                                          [data bytes],

                                          dataLength,

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    

    

    if (cryptStatus == kCCSuccess) {

        NSData *resultData = [NSDatadataWithBytesNoCopy:buffer length:numBytesCrypted];

        return [[[NSStringalloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];

    }

    free(buffer);

    return nil;

}



将key就是一次md5加密 获得标准的固定16位字符,  ;

所有key 以及加密算法都要和后台一致 才能成功;


0 0
原创粉丝点击