-
NSString+ThreeDES.m
-
// 3DE
-
//
-
// Created by Brandon Zhu on 31/10/2012.
-
// Copyright (c) 2012 Brandon Zhu. All rights reserved.
-
//
-
-
#import "NSString+ThreeDES.h"
-
#import <CommonCrypto/CommonCryptor.h>
-
#import <CommonCrypto/CommonDigest.h>
-
#import "GTMBase64.h"
-
-
// 前端与后台商量KEY
-
#define gkey @""
-
#define gIv @""
-
#define kSecrectKeyLength 24
-
-
@implementation NSString (ThreeDES)
-
-
+ (NSString*)encrypt:(NSString*)plainText withKey:(NSString*)key{
-
const charchar *cstr = [key cStringUsingEncoding:NSUTF8StringEncoding];
-
NSData *keyData = [NSData dataWithBytes:cstr length:key.length];
-
-
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
-
-
CC_SHA1(keyData.bytes, (CC_LONG)keyData.length, digest);
-
-
uint8_t keyByte[kSecrectKeyLength];
-
for (int i=0; i<16; i++) {
-
keyByte[i] = digest[i];
-
}
-
for (int i=0; i<8; i++) {
-
keyByte[16+i] = digest[i];
-
}
-
-
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
-
size_t plainTextBufferSize = [data length];
-
const voidvoid *vplainText = (const voidvoid *)[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((voidvoid *)bufferPtr, 0x0, bufferPtrSize);
-
-
const voidvoid *vkey = (const voidvoid *) keyByte;
-
const voidvoid *vinitVec = (const voidvoid *) [gIv UTF8String];
-
-
ccStatus = CCCrypt(kCCEncrypt,
-
kCCAlgorithm3DES,
-
kCCOptionPKCS7Padding,
-
vkey,
-
kCCKeySize3DES,
-
vinitVec,
-
vplainText,
-
plainTextBufferSize,
-
(voidvoid *)bufferPtr,
-
bufferPtrSize,
-
&movedBytes);
-
-
NSData *myData = [NSData dataWithBytes:(const voidvoid *)bufferPtr length:(NSUInteger)movedBytes];
-
NSString *result = [GTMBase64 stringByEncodingData:myData];
-
return result;
-
}
-
-
+ (NSString*)decrypt:(NSString*)encryptText withKey:(NSString*)key{
-
-
const charchar *cstr = [key cStringUsingEncoding:NSUTF8StringEncoding];
-
NSData *data = [NSData dataWithBytes:cstr length:key.length];
-
-
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
-
-
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
-
-
uint8_t keyByte[kSecrectKeyLength];
-
for (int i=0; i<16; i++) {
-
keyByte[i] = digest[i];
-
}
-
for (int i=0; i<8; i++) {
-
keyByte[16+i] = digest[i];
-
}
-
-
NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
-
size_t plainTextBufferSize = [encryptData length];
-
const voidvoid *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((voidvoid *)bufferPtr, 0x0, bufferPtrSize);
-
-
const voidvoid *vkey = (const voidvoid *) keyByte;
-
const voidvoid *vinitVec = (const voidvoid *) [gIv UTF8String];
-
-
ccStatus = CCCrypt(kCCDecrypt,
-
kCCAlgorithm3DES,
-
kCCOptionPKCS7Padding,
-
vkey,
-
kCCKeySize3DES,
-
vinitVec,
-
vplainText,
-
plainTextBufferSize,
-
(voidvoid *)bufferPtr,
-
bufferPtrSize,
-
&movedBytes);
-
-
NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const voidvoid *)bufferPtr
-
length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];
-
return result;
-
}
-
- (NSString*) sha1
-
{
-
const charchar *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
-
NSData *data = [NSData dataWithBytes:cstr length:self.length];
-
-
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
-
-
CC_SHA1(data.bytes, data.length, digest);
-
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
-
-
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
-
[output appendFormat:@"%02x", digest[i]];
-
-
return output;
-
}
-
-
@end