iOS中用到的3DES密码算法

转载 2016年08月29日 09:52:37

加密需要后台与前端统一,使用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  

相关文章推荐

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

NSString+ThreeDES.m   //  3DE   //   //  Created by Brandon Zhu on 31/10/2012.   //  Cop...

java密码学学习整理--对称加密(着重描述3des)

对称加密及密钥的管理(对实践的小结)

对称密码之3DES

至于 3DES 为什么会出现呢?其实,这个不难想到。由于 DES 是一种非常简便的加密算法,但是密钥长度比较短,计算量比较小,相对来说,比较容易被破解。因此,在 DES 的基础上,使用三重数据加密算法...

【密码学】DES加解密原理及其Java实现算法

DES简介 DES(Data Encryption Standard)是对称加解密算法的一种,由IBM公司W.Tuchman和C.Meyer在上个世纪70年代开发。 该算法使用64位密钥...

20141103 【 信息安全 】 对称密码体系 —— DES 加密算法

DES #include #include #include #include #include #incl...

DES算法C++代码实现-密码学

#include #include #include #include #include using namespace std; int ss[8][4][16]; void Init(...
  • MIKASA3
  • MIKASA3
  • 2016年11月08日 18:55
  • 654

密码学DES算法

  • 2012年03月23日 22:51
  • 3KB
  • 下载

DES密码算法实现(Verilog)

  • 2009年11月26日 13:35
  • 25KB
  • 下载

iOS将字符串3DES加密后转Base64

为NSString写分类 NSString+Base64After3DES .h文件 #import #import @interface NSString (Base64After3DES)...

密码学实验之des算法实现

  • 2009年12月09日 10:32
  • 1.82MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS中用到的3DES密码算法
举报原因:
原因补充:

(最多只允许输入30个字)