object-c 3des加解密工具类

加密的算法其实在大学学过,不过俺忘记了,这里权当一个工具类,方便下次使用
.h文件

#import <Foundation/Foundation.h>


@interface DES3Util : NSObject {

}

// 加密方法
+ (NSString*)encrypt:(NSString*)plainText Key:(NSString *)key value:(NSString *)value;

// 解密方法
+ (NSString*)decrypt:(NSString*)encryptText Key:(NSString *)key value:(NSString *)value;

/**
 *  encode
 */
+ (NSString *)encodeToPercentEscapeString: (NSString *) input;

/**
 *  解码
 */
+ (NSString *)decodeFromPercentEscapeString: (NSString *) input;

/**
 *  默认加密方法
 *  对应java 中CBC/PKCS5Padding,偏移量为8位,
 *  类似 12345678
 */
+ (NSString*)encrypt:(NSString*)plainText;

/**
 *  默认解密方法
 *  对应java 中CBC/PKCS5Padding,偏移量为8位,
 *  类似 12345678
 */
+ (NSString*)decrypt:(NSString*)encryptText;


/**
 des3加密方法
 在与后台交互的过程中,由于java 里面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,
 所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相当于PKCS5Padding
 编码:utf-8
 @param plainText 待加密的文本
 @return 加密后的文本
 */
+ (NSString*)des3Encrypt:(NSString*)plainText;


/**
 des3解密方法,与des3Encrypt 接口对应
 编码:utf-8
 @param encryptStr 待解密的文本
 @return 返回解密后的文本
 */
+ (NSString*)des3Decrypt:(NSString*)encryptStr;

@end

源文件.m

#import "DES3Util.h"
#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"

#define defaultKey            @"jerehjereijerehjerei1234"
#define defaultIv             @"jerhjereijijereh12345678"

@implementation DES3Util

// 加密方法
+ (NSString*)encrypt:(NSString*)plainText Key:(NSString *)key value:(NSString *)value{
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    size_t plainTextBufferSize = [data length];
    const void *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);

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

//    fix mem leak by zxy

//    ccStatus = CCCrypt(kCCEncrypt,
//                       kCCAlgorithm3DES,
//                       kCCOptionPKCS7Padding,
//                       vkey,
//                       kCCKeySize3DES,
//                       vinitVec,
//                       vplainText,
//                       plainTextBufferSize,
//                       (void *)bufferPtr,
//                       bufferPtrSize,
//                       &movedBytes);
//    
//    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
     CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    free(bufferPtr);
    NSString *result = [GTMBase64 stringByEncodingData:myData];
    return result;
}

// 解密方法
+ (NSString*)decrypt:(NSString*)encryptText Key:(NSString *)key value:(NSString *)value{
    NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
    size_t plainTextBufferSize = [encryptData length];
    const void *vplainText = [encryptData 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);

    const void *vkey = (const void *) [key UTF8String];
    const void *vinitVec = (const void *) [value UTF8String];
   //    fix mem leak by zxy
//    ccStatus = CCCrypt(kCCDecrypt,
//                       kCCAlgorithm3DES,
//                       kCCOptionPKCS7Padding,
//                       vkey,
//                       kCCKeySize3DES,
//                       vinitVec,
////                        nil,
//                       vplainText,
//                       plainTextBufferSize,
//                       (void *)bufferPtr,
//                       bufferPtrSize,
//                       &movedBytes);
//    
//    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
//                                                                      length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] ;

 CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       //                        nil,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                     length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] ;
    free(bufferPtr);
    return result;
}


+ (NSString *)encodeToPercentEscapeString: (NSString *) input
{
    NSString *outputStr = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(

                                                                             NULL, /* allocator */

                                                                             (__bridge CFStringRef)input,

                                                                             NULL, /* charactersToLeaveUnescaped */

                                                                             (CFStringRef)@"!*'();:@&=+$,/?%#[]",

                                                                             kCFStringEncodingUTF8);


    return  outputStr;
}

/**
 *  解码
 */
+ (NSString *)decodeFromPercentEscapeString: (NSString *) input

{

    NSMutableString *outputStr = [NSMutableString stringWithString:input];

    [outputStr replaceOccurrencesOfString:@"+"

                               withString:@""

                                  options:NSLiteralSearch

                                    range:NSMakeRange(0,[outputStr length])];

    return

    [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

}

/**
 *  默认加密方法
 */
+ (NSString*)encrypt:(NSString*)plainText
{
    return [DES3Util encrypt:plainText Key:defaultKey value:defaultIv];
}
/**
 *  默认解密方法
 */
+ (NSString*)decrypt:(NSString*)encryptText
{
    return [DES3Util decrypt:encryptText Key:defaultKey value:defaultIv];
}


+ (NSString*)des3Encrypt:(NSString*)plainText{
    //把string 转NSData
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];

    //length
    size_t plainTextBufferSize = [data length];

    const void *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);

    const void *vkey = (const void *) [defaultKey UTF8String];
    //偏移量
    const void *vinitVec = (const void *) [defaultIv UTF8String];

    //配置CCCrypt
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES, //3DES
                       kCCOptionECBMode|kCCOptionPKCS7Padding, //设置模式
                       vkey,    //key
                       kCCKeySize3DES,
                       vinitVec,     //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“”
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [GTMBase64 stringByEncodingData:myData];
    return result;
}

+ (NSString *)des3Decrypt:(NSString *)encryptStr{
    NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];

    size_t plainTextBufferSize = [encryptData length];
    const void *vplainText = [encryptData 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);

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

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

    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding|kCCOptionECBMode,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                     length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];


    return result;
}



@end

使用加密方式 :

NSString * result = [DES3Util des3Encrypt:@"this is test text"];
NSLog(@"69-------------:%@",result);

再将这个result放到 一个在线加解密的网站进行测试
http://tool.chacuo.net/crypt3des

猜你喜欢

转载自blog.csdn.net/d06110902002/article/details/81710518