ios平台下的DES加密
ios des 加/解密(with base64) #include <CommonCrypto/CommonCryptor.h> + (NSString*)Encrypte:(NSString*)src key:(NSString*)key{ NSString* retStr = nil; NSData* srcData = [src dataUsingEncoding:NSUTF8StringEncoding]; size_t dataOutAvilable = ([srcData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); unsigned char* dataOut = (unsigned char* )malloc(dataOutAvilable * sizeof(unsigned char)); memset((void*)dataOut, 0x0, dataOutAvilable); size_t dataOutMoved = 0; Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES, kCCOptionPKCS7Padding | kCCOptionECBMode, (void const*)[key UTF8String], kCCKeySize3DES, iv, [srcData bytes], [srcData length], (void*)dataOut, dataOutAvilable, &dataOutMoved); if (ccStatus == 0) {//成功 base64 int base64Len = base64_encode_length(dataOutMoved) + 2; char* tmp = new char[base64Len]; memset(tmp, 0, base64Len); int base64Ret = base64_encode((const char*)dataOut,dataOutMoved,tmp,base64Len); if (base64Ret > 0) { retStr = [[[NSString alloc] initWithUTF8String:tmp] autorelease]; } delete []tmp; } //NSLog(@"ccStatus: %d EncrypteStr:%@",ccStatus,retStr); delete dataOut; return retStr; } + (NSString*)Decypte:(NSString*)src key:(NSString*)key{ NSString* retStr = nil; int base64Len = base64_decode_length([src length]) + 2; char* tmp = new char[base64Len]; memset(tmp, 0, base64Len); CCCryptorStatus ccStatus = kCCParamError; int base64Ret = base64_decode([src UTF8String], [src length],tmp, base64Len); if (base64Ret > 0) { size_t dataOutAvilable = (base64Len + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); unsigned char* dataOut = (unsigned char* )malloc(dataOutAvilable * sizeof(unsigned char)); memset((void*)dataOut, 0x0, dataOutAvilable); size_t dataOutMoved = 0; Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithm3DES, kCCOptionPKCS7Padding | kCCOptionECBMode, (void const*)[key UTF8String], kCCKeySize3DES, iv, (const void*)tmp, base64Ret, (void*)dataOut, dataOutAvilable, &dataOutMoved); if (ccStatus == 0) { retStr = [[[NSString alloc] initWithBytes:dataOut length:dataOutMoved encoding:NSUTF8StringEncoding] autorelease]; } delete dataOut; } //NSLog(@"ccStatus: %d Decypte:%@",ccStatus,retStr); delete []tmp; return retStr; }
今天终于把ios平台下的DES加密算法调通了,在这里记录一下。说一下我遇到的问题吧。
第一,关于传参,Objective-C和C,C++一样,不能把值类型数组做为参数,传给另一个方法,方法的返回值的类型也一样不可以是值类型数组。一旦这么做了,接受参数的方法只能获取数组中的首元素。
解决方法是用 NSMutableData 把值类型的数组包一层,代码如下:
NSMutableData* bufkeyData =[NSMutableData dataWithLength:2];
int* bufkey = bufkeyData.mutableBytes;
传参 [self make_key:bufkeyData number:j];
取值 int* bufkey = bufkeyData.mutableBytes;
第二,NSData 与 Byte[]之间的转换
NSData *btsData = http://www.cnblogs.com/upwifi/archive/2011/09/05/[in_strdataUsingEncoding:NSUTF8StringEncoding];
Byte *byteData = http://www.cnblogs.com/upwifi/archive/2011/09/05/(Byte*)malloc(len);
memcpy(byteData, [btsData bytes], len);
NSMutableData *bts2Data = http://www.cnblogs.com/upwifi/archive/2011/09/05/[NSMutableDatadataWithLength:len];
[bts2Data initWithBytes:byteData length:len];
第三,需要用一下 Base64 给加密前的和加密后的字串做Encod和Decode处理,我用了第三方的NSData+Base64.m
下面是头文件:
//
// DesEncrypt.h
// DesEncryptDemo
//
// Created by fred yu on 9/2/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
enum DesStrategy {
DesSimple = 1,
Des3 = 2,
DesCBC = 3,
DesTwoKeys = 4
};
typedef enum DesStrategy DesStrategy;
@interface DesEncrypt : NSObject {
NSMutableArray *keyArray;
}
-(NSData *)des:(NSData *)input_data key:(NSString *)key encrypt:(bool)encrypt;
//Encrypt
-(NSString*)encrypt:(NSString *)in_str key:(NSString *)key desMode:(DesStrategy)desMode str2:(NSString *)str2;
//Decrypt
-(NSString*)decrypt:(NSString *)in_str key:(NSString *)key desMode:(DesStrategy)desMode str2:(NSString *)str2;
//DesCBC
-(NSMutableData *)desCBC:(NSMutableData *)input_data key:(NSString *)key_str iv:(NSString *)iv encrypt:(bool)encrypt;
-(NSMutableData *)des:(NSMutableData *)data key:(NSMutableData *)key iv:(NSMutableData *)iv encrypt:(bool)encrypt;
//DesCreateKeys
-(void)desCreateKeys:(NSMutableData *)key;
//make_data
-(void)make_data:(NSMutableData *)data number:(int)number;
//make_key
-(NSMutableData *)make_key:(NSMutableData *)in_key number:(int)number;
//handle_data
-(NSMutableData *)handle_data:(NSMutableData *)data encrypt:(bool)encrypt;
//change_data
-(NSMutableData *)change_data:(NSMutableData *)olddata change_tbType:(int)change_tbType;
@end
测试代码及输出结果:
#import <Foundation/Foundation.h>
#import "DesEncrypt.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// insert code here...
DesEncrypt * desEncrypt = [[DesEncrypt alloc] init];
NSString *key1 = @"12345678";
NSString *key2 = @"45678923";
NSString *msg = @"abcdefghijk";
NSLog(@"消息: %@",msg);
NSString *s = [desEncrypt encrypt:msg key:key1 desMode:DesCBC str2:key2];
NSLog(@"经过加密处理: %@",s);
NSString *ss = [desEncrypt decrypt:s key:key1 desMode:DesCBC str2:key2];
NSLog(@"经过解密处理: %@",ss);
[pool drain];
return 0;
}
fred-yus-MacBook-Pro:~ fred$ /Users/fred/Documents/DesEncryptDemo/build/Debug/DesEncryptDemo ; exit;
2011-09-05 13:05:08.552 DesEncryptDemo[6085:903] 消息: abcdefghijk
2011-09-05 13:05:08.555 DesEncryptDemo[6085:903] 经过加密处理: vL5Am3KcszqpJdB594OrkA==
2011-09-05 13:05:08.555 DesEncryptDemo[6085:903] 经过解密处理: abcdefghijk
logout

浙公网安备 33010602011771号