关闭

iOS中用到的3DES密码算法

标签: iOS3DES加密
334人阅读 评论(0) 收藏 举报
分类:

加密需要后台与前端统一,使用3DES加密算法:

[objc] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:145949次
    • 积分:1982
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:322篇
    • 译文:1篇
    • 评论:2条
    最新评论