iOS开发学习中用到的3DES密码算法

  1. NSString+ThreeDES.m  
  2. //  3DE  
  3. //  
  4. //  Created by Brandon Zhu on 31/10/2012.  
  5. //  Copyright (c) 2012 Brandon Zhu. All rights reserved.  
  6. //  
  7.   
  8. #import "NSString+ThreeDES.h"  
  9. #import <CommonCrypto/CommonCryptor.h>  
  10. #import <CommonCrypto/CommonDigest.h>  
  11. #import "GTMBase64.h"  
  12.   
  13. // 前端与后台商量KEY  
  14. #define gkey @""  
  15. #define gIv  @""  
  16. #define kSecrectKeyLength 24  
  17.   
  18. @implementation NSString (ThreeDES)  
  19.   
  20. + (NSString*)encrypt:(NSString*)plainText withKey:(NSString*)key{  
  21.     const charchar *cstr = [key cStringUsingEncoding:NSUTF8StringEncoding];  
  22.     NSData *keyData = [NSData dataWithBytes:cstr length:key.length];  
  23.       
  24.     uint8_t digest[CC_SHA1_DIGEST_LENGTH];  
  25.       
  26.     CC_SHA1(keyData.bytes, (CC_LONG)keyData.length, digest);  
  27.       
  28.     uint8_t keyByte[kSecrectKeyLength];  
  29.     for (int i=0; i<16; i++) {  
  30.         keyByte[i] = digest[i];  
  31.     }  
  32.     for (int i=0; i<8; i++) {  
  33.         keyByte[16+i] = digest[i];  
  34.     }  
  35.       
  36.     NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];  
  37.     size_t plainTextBufferSize = [data length];  
  38.     const voidvoid *vplainText = (const voidvoid *)[data bytes];  
  39.       
  40.     CCCryptorStatus ccStatus;  
  41.     uint8_t *bufferPtr = NULL;  
  42.     size_t bufferPtrSize = 0;  
  43.     size_t movedBytes = 0;  
  44.       
  45.     bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);  
  46.     bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));  
  47.     memset((voidvoid *)bufferPtr, 0x0, bufferPtrSize);  
  48.       
  49.     const voidvoid *vkey = (const voidvoid *) keyByte;  
  50.     const voidvoid *vinitVec = (const voidvoid *) [gIv UTF8String];  
  51.       
  52.     ccStatus = CCCrypt(kCCEncrypt,  
  53.                        kCCAlgorithm3DES,  
  54.                        kCCOptionPKCS7Padding,  
  55.                        vkey,  
  56.                        kCCKeySize3DES,  
  57.                        vinitVec,  
  58.                        vplainText,  
  59.                        plainTextBufferSize,  
  60.                        (voidvoid *)bufferPtr,  
  61.                        bufferPtrSize,  
  62.                        &movedBytes);  
  63.       
  64.     NSData *myData = [NSData dataWithBytes:(const voidvoid *)bufferPtr length:(NSUInteger)movedBytes];  
  65.     NSString *result = [GTMBase64 stringByEncodingData:myData];  
  66.     return result;  
  67. }  
  68.   
  69. + (NSString*)decrypt:(NSString*)encryptText withKey:(NSString*)key{  
  70.       
  71.     const charchar *cstr = [key cStringUsingEncoding:NSUTF8StringEncoding];  
  72.     NSData *data = [NSData dataWithBytes:cstr length:key.length];  
  73.       
  74.     uint8_t digest[CC_SHA1_DIGEST_LENGTH];  
  75.       
  76.     CC_SHA1(data.bytes, (CC_LONG)data.length, digest);  
  77.       
  78.     uint8_t keyByte[kSecrectKeyLength];  
  79.     for (int i=0; i<16; i++) {  
  80.         keyByte[i] = digest[i];  
  81.     }  
  82.     for (int i=0; i<8; i++) {  
  83.         keyByte[16+i] = digest[i];  
  84.     }  
  85.       
  86.     NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];  
  87.     size_t plainTextBufferSize = [encryptData length];  
  88.     const voidvoid *vplainText = [encryptData bytes];  
  89.       
  90.     CCCryptorStatus ccStatus;  
  91.     uint8_t *bufferPtr = NULL;  
  92.     size_t bufferPtrSize = 0;  
  93.     size_t movedBytes = 0;  
  94.       
  95.     bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);  
  96.     bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));  
  97.     memset((voidvoid *)bufferPtr, 0x0, bufferPtrSize);  
  98.       
  99.     const voidvoid *vkey = (const voidvoid *) keyByte;  
  100.     const voidvoid *vinitVec = (const voidvoid *) [gIv UTF8String];  
  101.       
  102.     ccStatus = CCCrypt(kCCDecrypt,  
  103.                        kCCAlgorithm3DES,  
  104.                        kCCOptionPKCS7Padding,  
  105.                        vkey,  
  106.                        kCCKeySize3DES,  
  107.                        vinitVec,  
  108.                        vplainText,  
  109.                        plainTextBufferSize,  
  110.                        (voidvoid *)bufferPtr,  
  111.                        bufferPtrSize,  
  112.                        &movedBytes);  
  113.       
  114.     NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const voidvoid *)bufferPtr  
  115.                                                                       length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];  
  116.     return result;  
  117. }  
  118. - (NSString*) sha1  
  119. {  
  120.     const charchar *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];  
  121.     NSData *data = [NSData dataWithBytes:cstr length:self.length];  
  122.       
  123.     uint8_t digest[CC_SHA1_DIGEST_LENGTH];  
  124.       
  125.     CC_SHA1(data.bytes, data.length, digest);  
  126.     NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];  
  127.       
  128.     for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)  
  129.         [output appendFormat:@"%02x", digest[i]];  
  130.       
  131.     return output;  
  132. }  
  133.   
  134. @end 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值