码迷,mamicode.com
首页 > 移动开发 > 详细

iOS POS之3DES加密

时间:2015-06-26 19:53:57      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:ios   加密   pos   3des   8583   

最近在做支付类APP,遇到了很多以前没遇到过的东西。接下来我会用这系列文章来记录我所遇到的问题。


首先就是在组8583报文时用到的3DES加密。8583报文是以字节为单位的所以可能3DES加密会有稍许不同。

我自己搞这个问题也搞了两天,最后还是拜托一个高手给搞定的。


我在网上也搜了很多资料最后发现有一帖子很接近答案。链接如下:

http://www.cocoachina.com/bbs/read.php?tid=245410  

请教高手所做的就是把哈希那句给去掉然后稍微做下处理,有兴趣的同学可以自己做下对比。


经本人无数次验证没问题,首先给出一个加密的例子


   /*

     密文:EC643168D551763F1CC9762AD7ACF556

     密钥:49D5E0D326518A10F7E5611A5B0D8054

     明文:CD8DF81926A629C5715830F89981F278

     */



没什么说的直接上代码


+ (NSString *)threeDESEncrypt:(NSString *)plainText withKey:(NSString *)key{

    //16进制字符串转为 data数据

   NSData  *data = [NSStringhexToBytes:key];


    //组装解密key取前16个字节然后再次取前8个字节组成key

   uint8_t *git = (uint8_t *)[databytes];

   uint8_t keyByte[24];

   for (int i=0; i<16; i++) {

        keyByte[i] = git[i];

    }

   for (int i=0; i<8; i++) {

        keyByte[16+i] = git[i];

    }

    

   NSData *EncryptData = [NSStringhexToBytes:plainText];

    

   size_t plainTextBufferSize = [EncryptData length];

    

   const void *vplainText = [EncryptDatabytes];

    

    CCCryptorStatus ccStatus;

   uint8_t *bufferPtr = NULL;

   size_t bufferPtrSize = 0;

   size_t movedBytes = 0;

    

    bufferPtrSize = (plainTextBufferSize +kCCBlockSize3DES) & ~(kCCBlockSize3DES -1);

    

    bufferPtr =malloc(bufferPtrSize * sizeof(uint8_t));

    

   memset((void *)bufferPtr,0x0, bufferPtrSize);

    

   const void *vkey = (constvoid *) keyByte;

    

    ccStatus =CCCrypt(kCCEncrypt,

                       

                      kCCAlgorithm3DES,

                       

                      kCCOptionECBMode,

                       

                       vkey,

                       

                      kCCKeySize3DES,

                       

                      nil,

                       

                       vplainText,

                       

                       plainTextBufferSize,

                       

                       (void *)bufferPtr,

                       

                       bufferPtrSize,

                       

                       &movedBytes);

    

   NSData *dataresult = [NSDatadataWithBytes:(constvoid *)bufferPtr

                          

                                       length:(NSUInteger)movedBytes];

    

    

   NSString *result = [NSStringhexStringFromData:dataresult];

    

   return [result uppercaseString];

}


其中用到的两个方法如下


/**

 *  十六 进制字符串转换为 data

 *  24211D3498FF62AF  -->  <24211D34 98FF62AF>

 *

 *  @param str 要转换的字符串

 *

 *  @return 转换后的数据

 */


+(NSData*)hexToBytes:(NSString *)str{

    

    NSMutableData* data = [NSMutableDatadata];

    

   int idx;

    

   for (idx = 0; idx+2 <= str.length; idx+=2) {

        

       NSRange range = NSMakeRange(idx,2);

        

       NSString* hexStr = [str substringWithRange:range];

        

       NSScanner* scanner = [NSScannerscannerWithString:hexStr];

        

       unsigned int intValue;

        

        [scannerscanHexInt:&intValue];

        

        [dataappendBytes:&intValue length:1];

        

    }

    

   return data;

}


/**

 *  data 转换为十六进制字符串

 *  <24211D34 98FF62AF>  -->  24211D3498FF62AF

 *

 *  @param data 要转换的data

 *

 *  @return 转换后的字符串

 */

+ (NSString *)hexStringFromData:(NSData *)data{

    

    NSMutableString *str = [NSMutableStringstring];

    

   Byte *byte = (Byte *)[databytes];

    

   for (int i =0; i<[data length]; i++) {

        

        // byte+i为指针

        

        [strappendString:[selfstringFromByte:*(byte+i)]];

        

    }

    

   return str;

    

}


以上就是全部代码,这里只给出了加密的代码,其实解密的代码也是一样,只是代码中的 kCCEncrypt改为 

kCCDecrypt之后就由加密变成了解密。


这就是iOS中的3DES加密,只是针对于8583报文的3DES加密,至于其他地方遇到的3DES加密也许会略有不同,但总体来说流程就是这样。


如有问题欢迎来跟我一起讨论 ———— LC






版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS POS之3DES加密

标签:ios   加密   pos   3des   8583   

原文地址:http://blog.csdn.net/lc_obj/article/details/46652425

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!