加密的算法其实在大学学过,不过俺忘记了,这里权当一个工具类,方便下次使用
.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