iOS POS之3DES加密,iospos3des

來源:互聯網
上載者:User

iOS POS之3DES加密,iospos3des

最近在做支付類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 = [EncryptDatalength];

    

   constvoid *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);

    

   constvoid *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 [resultuppercaseString];

}


其中用到的兩個方法如下


/**

 *  十六 進位字串轉換為 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 = [strsubstringWithRange:range];

        

       NSScanner* scanner = [NSScannerscannerWithString:hexStr];

        

       unsignedint intValue;

        

        [scannerscanHexInt:&intValue];

        

        [dataappendBytes:&intValuelength: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<[datalength]; i++) {

        

        // byte+i為指標

        

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

        

    }

    

   return str;

    

}


以上就是全部代碼,這裡只給出了加密的代碼,其實解密的代碼也是一樣,只是代碼中的 kCCEncrypt改為 

kCCDecrypt之後就由加密變成瞭解密。


這就是iOS中的3DES加密,只是針對於8583報文的3DES加密,至於其他地方遇到的3DES加密也許會略有不同,但總體來說流程就是這樣。


如有問題歡迎來跟我一起討論 ———— LC






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.