轉自:http://www.cnblogs.com/upwifi/archive/2011/09/05/2166943.html
今天終於把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 = [in_str dataUsingEncoding:NSUTF8StringEncoding];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [btsData bytes], len);
NSMutableData *bts2Data = [NSMutableData dataWithLength:len];
[bts2Data initWithBytes:byteData length:len];
第三,i386架構下定義值類型變量需賦初值
下面是頭文件:
//
// 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