- //
- // 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