Fork me on GitHub

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 allocinit];

 

    // insert code here...

 

    DesEncrypt * desEncrypt = [[DesEncrypt allocinit];

 

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 

posted on 2012-05-14 10:58  pengyingh  阅读(1042)  评论(0)    收藏  举报

导航