#import <CommonCrypto/CommonCryptor.h>
@implementation SZSecurity
//3des加解密
+ (NSString*)TripleDES:(NSString*)plainText encryptOrDecrypt:(CCOperation)encryptOrDecrypt withKey:(NSString *)DESKEY {
const void *vplainText;
size_t plainTextBufferSize;
if (encryptOrDecrypt == kCCDecrypt) { //解密
NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];
plainTextBufferSize = [EncryptData length];
vplainText = [EncryptData bytes];
}
else { //加密
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
plainTextBufferSize = [data length];
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 = (uint8_t *)malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
Byte iv[] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
memset((void *) iv, 0x0, (size_t) sizeof(iv));
const void *vkey = (const void *) [DESKEY UTF8String];
ccStatus = CCCrypt(encryptOrDecrypt, kCCAlgorithm3DES, kCCOptionPKCS7Padding | kCCOptionECBMode, vkey, kCCKeySize3DES, (void *)iv, vplainText, plainTextBufferSize, (void *)bufferPtr, bufferPtrSize, &movedBytes);
if (ccStatus == kCCSuccess) {
} else if (ccStatus == kCCParamError) {
free(bufferPtr);
return @"";
} else if (ccStatus == kCCBufferTooSmall) {
free(bufferPtr);
return @"";
} else if (ccStatus == kCCMemoryFailure) {
free(bufferPtr);
return @"";
} else if (ccStatus == kCCAlignmentError) {
free(bufferPtr);
return @"";
} else if (ccStatus == kCCDecodeError) {
free(bufferPtr);
return @"";
} else if (ccStatus == kCCUnimplemented) {
free(bufferPtr);
return @"";
}
NSString *result;
if (encryptOrDecrypt == kCCDecrypt) {
result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
} else {
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [GTMBase64 stringByEncodingData:myData];
}
free(bufferPtr);
return result;
}
// des 加密
+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
{
NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[data bytes],
[data length],
buffer,
1024,
&numBytesEncrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
plainText = [GTMBase64 stringByEncodingData:dataTemp];
}else{
NSLog(@"DES加密失败");
}
return plainText;
}
// 解密
+(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {
// 利用 GTMBase64 解碼 Base64 字串
NSData* cipherData = [GTMBase64 decodeString:cipherText];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;
// IV 偏移量不需使用
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[cipherData bytes],
[cipherData length],
buffer,
1024,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}
return plainText;
}
des加密:
明文:abcd
秘钥:qwertyui12345678
密文:ZTvveNBJjbs=