3DES加密

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值