欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一行代碼實(shí)現(xiàn)IOS 3DES加密解密

 更新時(shí)間:2015年12月12日 11:35:03   作者:鴻鵠當(dāng)高遠(yuǎn)  
這篇文章主要介紹了一行代碼實(shí)現(xiàn)IOS 3DES加密解密的相關(guān)資料,需要的朋友可以參考下

3DES(或稱為Triple DES)是三重?cái)?shù)據(jù)加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES加密算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長(zhǎng)度變得容易被暴力破解;3DES即是設(shè)計(jì)用來(lái)提供一種相對(duì)簡(jiǎn)單的方法,即通過(guò)增加DES的密鑰長(zhǎng)度來(lái)避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。 

3DES又稱Triple DES,是DES加密算法的一種模式,它使用3條56位的密鑰對(duì)數(shù)據(jù)進(jìn)行三次加密。數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)是美國(guó)的一種由來(lái)已久的加密標(biāo)準(zhǔn),它使用對(duì)稱密鑰加密法,并于1981年被ANSI組織規(guī)范為ANSI X.3.92。DES使用56位密鑰和密碼塊的方法,而在密碼塊的方法中,文本被分成64位大小的文本塊然后再進(jìn)行加密。比起最初的DES,3DES更為安全。

一行代碼實(shí)現(xiàn)3DES加密解密需要用到寫的 JKEncrypt  https://github.com/jukai9316/JKEncrypt。

下面先解析以下3DES的實(shí)現(xiàn),然后再說(shuō),如何使用JKEncrypt。

注意點(diǎn):填充方式不一樣

在與后臺(tái)交互的過(guò)程中,由于java 里面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相當(dāng)于PKCS5Padding。

 以下是3DES 256 在iOS開(kāi)發(fā)中的實(shí)現(xiàn):

#import <CommonCrypto/CommonDigest.h> 
#import <CommonCrypto/CommonCryptor.h>
#import <Security/Security.h>
#import "GTMBase64.h" 
//密匙 key
#define gkey      @"Kyle_Chu"
//偏移量
#define gIv       @"jukai" 
//字符串加密
-(NSString *)doEncryptStr:(NSString *)originalStr{
  //把string 轉(zhuǎn)NSData
  NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
  //length
  size_t plainTextBufferSize = [data length];
  const void *vplainText = (const void *)[data bytes];
  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 = (const void *) [gkey UTF8String];
  //偏移量
  const void *vinitVec = (const void *) [gIv UTF8String];
  //配置CCCrypt
  ccStatus = CCCrypt(kCCEncrypt,
            kCCAlgorithm3DES, //3DES
            kCCOptionECBMode|kCCOptionPKCS7Padding, //設(shè)置模式
            vkey,  //key
            kCCKeySize3DES,
            vinitVec,   //偏移量,這里不用,設(shè)置為nil;不用的話,必須為nil,不可以為@“”
            vplainText,
            plainTextBufferSize,
            (void *)bufferPtr,
            bufferPtrSize,
            &movedBytes);
  NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
  NSString *result = [GTMBase64 stringByEncodingData:myData];
  return result;
} 
//字符串解密
-(NSString*)doDecEncryptStr:(NSString *)encryptStr{
  NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];
  size_t plainTextBufferSize = [encryptData length];
  const void *vplainText = [encryptData bytes];
  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 = (const void *) [gkey UTF8String];
  const void *vinitVec = (const void *) [gIv UTF8String];
  ccStatus = CCCrypt(kCCDecrypt,
            kCCAlgorithm3DES,
            kCCOptionPKCS7Padding|kCCOptionECBMode,
            vkey,
            kCCKeySize3DES,
            vinitVec,
            vplainText,
            plainTextBufferSize,
            (void *)bufferPtr,
            bufferPtrSize,
            &movedBytes);
  NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                   length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
  return result;
} 

十六進(jìn)制的實(shí)現(xiàn)省略了,可以閱讀JKEncrypt.m

JKEncrypt的使用:

//1、設(shè)置您需要的密匙、偏移量
//密匙 key
#define gkey      @"Kyle_Chu"
//偏移量
#define gIv       @"jukai" 
// @"kyle_jukai" 是測(cè)試字符串,換成您需要加密的內(nèi)容即可
JKEncrypt * en = [[JKEncrypt alloc]init];
//加密
NSString * encryptStr = [en doEncryptStr: @"kyle_jukai"];
NSString * encryptHex = [en doEncryptHex: @"kyle_jukai"];
NSLog(@"字符串加密:%@",encryptStr);
NSLog(@"十六進(jìn)制加密:%@",encryptHex);
//解密
NSString *decEncryptStr = [en doDecEncryptStr:encryptStr];
NSString *decEncryptHex = [en doEncryptHex:encryptHex];
NSLog(@"字符串解密:%@",decEncryptStr);
NSLog(@"字符串解密:%@",decEncryptHex); 

ps:iOS DES加密與3DES加密

最近項(xiàng)目中遇到了加解密的問(wèn)題,然后翻閱了相關(guān)資料,成功搞定。 現(xiàn)在將這些知識(shí)點(diǎn)總結(jié)一下,一是為了以后復(fù)習(xí),二是為了給大家提供參考。

1.  先來(lái)說(shuō)說(shuō)DES操作,定義我這里就不敘述了,網(wǎng)上一堆一堆的。接下來(lái)說(shuō)一下使用時(shí)應(yīng)該注意的幾點(diǎn)。 首先,大家要分清Key(密鑰),Data(待操作數(shù)據(jù))跟Mode(加密模式)。其中Key必須為8字節(jié)(64位),Data需要是8字節(jié)(64位)的倍數(shù),這里需要注意了,如果Data不是8字節(jié)的倍數(shù),那么我們需要進(jìn)行數(shù)據(jù)填充,數(shù)據(jù)填充使用的算法不一定相同。Mode貌似有許多種,這里只簡(jiǎn)單的說(shuō)一下ECB跟CBC模式。

ECB模式:將待處理的數(shù)據(jù)分成若干塊,每塊的長(zhǎng)度都為8字節(jié)(64位),與Key長(zhǎng)度相同。然后對(duì)每塊進(jìn)行加密或解密,最后將他們連接在一起便是最終的結(jié)果。每一塊的數(shù)據(jù)互不干擾。

CBC模式:也需要將待處理的數(shù)據(jù)分塊,但是每一塊數(shù)據(jù)在加密或者解密之前都要與前一塊的結(jié)果做一次異或操作,因此該模式需要定義一個(gè)特殊的8字節(jié)Key,用于和第一塊數(shù)據(jù)做異或操作。這個(gè)特殊的Key就是通常說(shuō)的初始化向量。在代碼中書寫時(shí)需要配置iv參數(shù),注意iv參數(shù)是對(duì)應(yīng)CBC模式的。這樣一來(lái),每一塊數(shù)據(jù)都是有聯(lián)系的,這是與ECB模式不同的一點(diǎn)。

2. 再來(lái)說(shuō)說(shuō)3DES操作,也就是進(jìn)行3次DES操作。設(shè)Ek()和Dk()分別代表DES算法的加密和解密過(guò)程,k代表DES算法使用的密鑰,P代表明文,C代表密文,則3DES算法的過(guò)程可表示為:

C = Ek3(Dk2(Ek1(P)))

P = Dk1(Ek2(Dk3(C)))

3DES同樣有ECB跟CBC模式,同上面講的一樣。這里需要注意一下Key的長(zhǎng)度,應(yīng)該是24位。比如我們已知的Key是16位的,那么我們需要將其分為2段,每一段都是8位,則k1=左8位, k2=右8位,k3=左8位,也就是  k1=k3,但不能k1=k2=k3,因?yàn)槿绻慷问褂玫腒ey都相同,就回到DES算法了。

相關(guān)文章

  • Flutter使用push pop方法及路由進(jìn)行導(dǎo)航詳解

    Flutter使用push pop方法及路由進(jìn)行導(dǎo)航詳解

    這篇文章主要為大家介紹了Flutter使用push pop方法及路由進(jìn)行導(dǎo)航詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • iOS xib文件中添加ScrollView約束的方法

    iOS xib文件中添加ScrollView約束的方法

    下面小編就為大家分享一篇iOS xib文件中添加ScrollView約束的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • UILabel顯示定時(shí)器文本跳動(dòng)問(wèn)題的解決方法

    UILabel顯示定時(shí)器文本跳動(dòng)問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于UILabel顯示定時(shí)器文本跳動(dòng)問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫(kù)的教程

    iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫(kù)的教程

    SQLite是一個(gè)極輕的嵌入式數(shù)據(jù)庫(kù),在應(yīng)用程序中捆綁使用可以更方便地幫助操控關(guān)系型數(shù)據(jù),這里我們就來(lái)看一下iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫(kù)的教程
    2016-06-06
  • iOS當(dāng)多個(gè)網(wǎng)絡(luò)請(qǐng)求完成后執(zhí)行下一步的方法詳解

    iOS當(dāng)多個(gè)網(wǎng)絡(luò)請(qǐng)求完成后執(zhí)行下一步的方法詳解

    在多線程中,有時(shí)候我們會(huì)遇到一個(gè)界面同時(shí)有多個(gè)網(wǎng)絡(luò)請(qǐng)求(比如a,b,c,d四個(gè)網(wǎng)絡(luò)請(qǐng)求),在這四個(gè)個(gè)請(qǐng)求結(jié)束后,在請(qǐng)求到數(shù)據(jù)去做其他操作(UI更新等),下面這篇文章主要給大家介紹了關(guān)于iOS當(dāng)多個(gè)網(wǎng)絡(luò)請(qǐng)求完成后執(zhí)行下一步的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • iOS CoreAnimation 圖層幾何學(xué)

    iOS CoreAnimation 圖層幾何學(xué)

    本文主要介紹了iOS CoreAnimation圖層幾何學(xué),圖層幾何所講主要是有關(guān)圖層的位置,尺寸等幾何類屬性。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • IOS實(shí)現(xiàn)聊天界面底部菜單欄效果

    IOS實(shí)現(xiàn)聊天界面底部菜單欄效果

    本文給大家分享的是放boss直聘當(dāng)中的聊天信息界面,主要思路是約束動(dòng)畫,實(shí)現(xiàn)代碼比較簡(jiǎn)單,下面小編通過(guò)本文給大家分享IOS實(shí)現(xiàn)聊天界面底部菜單欄效果,需要的的朋友參考下吧
    2017-09-09
  • IOS實(shí)現(xiàn)圓形圖片效果的兩種方法

    IOS實(shí)現(xiàn)圓形圖片效果的兩種方法

    這篇文章介紹在IOS中如何實(shí)現(xiàn)圓形圖片,實(shí)現(xiàn)后的效果很贊,有需要的可以參考借鑒。
    2016-08-08
  • iOS 動(dòng)畫實(shí)戰(zhàn)之釣魚小游戲?qū)嵗a

    iOS 動(dòng)畫實(shí)戰(zhàn)之釣魚小游戲?qū)嵗a

    最近小編做了一個(gè)釣魚小游戲,平時(shí)沒(méi)有做過(guò),所以上手有點(diǎn)急躁,不過(guò),最終還是實(shí)現(xiàn)了,下面小編給大家分享iOS 動(dòng)畫實(shí)戰(zhàn)之釣魚小游戲的實(shí)現(xiàn)思路,感興趣的朋友一起看看吧
    2018-02-02
  • iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用

    iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論