分享

iOS下的DES加密

 叹落花 2015-06-17
例一:

这里使用框架提供的des加解密库: 这里使用框架提供的des加解密库: 首先引入头文件 #import < CommonCrypto/CommonCryptor.h >
主要的加解密函数如下:

(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext nil;
    const char *textBytes [plainText UTF8String];
    NSUInteger dataLength [plainText length];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    Byte iv[] {1,2,3,4,5,6,7,8};
    size_t numBytesEncrypted 0;
    CCCryptorStatus cryptStatus CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [key UTF8String], kCCKeySizeDES,
                                          iv,
                                          textBytes, dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        
        ciphertext [[[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding] autorelease];
    }
    return ciphertext;
}
 
//解密
(NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key 
{
    NSData* cipherData [GTMBase64 decodeString:cipherText];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesDecrypted 0;
    Byte iv[] {1,2,3,4,5,6,7,8};
    CCCryptorStatus cryptStatus CCCrypt(kCCDecrypt, 
                                          kCCAlgorithmDES, 
                                          kCCOptionPKCS7Padding, 
                                          [key UTF8String], 
                                          kCCKeySizeDES, 
                                          iv, 
                                          [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;
}

例二:

iOS下的DES加密

  今天终于把iOS平台下的DES加密算法调通了,在这里记录一下。说一下我遇到的问题吧。    


  第一,关于传参,Objective-C和C,C++一样,不能把值类型数组做为参数,传给另一个方法,方法的返回值的类型也一样不可以是值类型数组。一旦这么做了,接受参数的方法只能获取数组中的首元素。    


       解决方法是用 NSMutableData 把值类型的数组包一层,代码如下:    


      NSMutableData* bufkeyData = [NSMutableDatadataWithLength: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 = [NSMutableDatadataWithLength: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  >  

 

 

enumDesStrategy {

    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 = [[NSAutoreleasePoolallocinit];

 

    // insert code here...

 

    DesEncrypt * desEncrypt = [[DesEncrypt allocinit];

 

   NSString *key1 = @"23245321";

   NSString *key2 = @"77585210";

 

   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    


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多