1. 程式人生 > >iOS開發各種加密方式

iOS開發各種加密方式

這裡封裝的是iOS使用到的各種加密方法,MD5加密,AES加密,Base64加密,DES加密,生成32UUID,類需要繼承

<Foundation/Foundation.h>框架

注意:.m檔案需要匯入

#import <CommonCrypto/CommonDigest.h>

#import <CommonCrypto/CommonCryptor.h>


.h檔案實現介面:

/**

 *  生成32位UUID,不帶'-'

 *

 *  @return 32位UUID

 */

+ (NSString *)createUUID;

#pragma mark - MD5

/**

 *  md5加密

 *

 *  @param str 要加密的字串

 *

 *  @return 32位md5字串

 */

+ (NSString *)md5:(NSString *)input;

#pragma mark - SHA

/**

 *  sha1加密

 *

 *  @param input 要加密的字串

 *

 *  @return 加密後的字串

 */

+ (NSString *)sha1:(NSString *)input;

+ (NSString *)sha224:(NSString *)input;

+ (NSString *)sha256:(NSString

*)input;

+ (NSString *)sha384:(NSString *)input;

+ (NSString *)sha512:(NSString *)input;

#pragma mark - DES

/**

 *  DES加密

 *

 *  @param key  金鑰

 *  @param data 加密資料

 *

 *  @return 加密後的資料

 */

+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data;

/**

 *  DES解密

 *

 *  @param

key  金鑰

 *  @param data 解密資料

 *

 *  @return 解密後的資料

 */

+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data;

#pragma mark - AES

/**

 *  AES256加密

 *

 *  @param key  金鑰

 *  @param data 加密資料

 *

 *  @return 加密後的資料

 */

+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data;

/**

 *  AES256解密

 *

 *  @param key  金鑰

 *  @param data 解密資料

 *

 *  @return 解密後的資料

 */

+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data;

#pragma mark - Base64

/**

 *  NSData轉Base64

 *

 *  @param data

 *

 *  @return

 */

+ (NSString *)base64EncodedStringWithData:(NSData *)data;

/**

 *  Base64轉NSData

 *

 *  @param base64String

 *

 *  @return

 */

+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String;

/**

 *  NSString轉Base64

 *

 *  @param string

 *

 *  @return

 */

+ (NSString *)base64EncodedString:(NSString *)string;

/**

 *  Base64轉NSString

 *

 *  @param base64String base64字串

 *

 *  @return

 */

+ (NSString *)stringWithBase64Encoded:(NSString *)base64String;


.m檔案實現介面:

staticconstchar encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

+ (NSString *)createUUID

{

    NSUUID *uuid = [NSUUID UUID];

return [[uuid UUIDString] stringByReplacingOccurrencesOfString:@"-"withString:@""];

}

#pragma mark - MD5

+ (NSString *)md5:(NSString *)input

{

    const char *cStrValue = [input UTF8String];

    if (cStrValue == NULL) {

        cStrValue = "";

    }

unsignedchar r[CC_MD5_DIGEST_LENGTH];

    CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), r);

return [NSStringstringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",

            r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14], r[15]];

}

#pragma mark - SHA1

+ (NSString *)sha1:(NSString *)input

{

    const char *ptr = [input UTF8String];

    int i =0;

    int len = (int)strlen(ptr);

    Byte byteArray[len];

    while (i!=len)

    {

        unsigned eachChar = *(ptr + i);

        unsigned low8Bits = eachChar & 0xFF;

        byteArray[i] = low8Bits;

        i++;

    }

unsignedchar digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(byteArray, len, digest);

NSMutableString *hex = [NSMutableStringstring];

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

        [hex appendFormat:@"%02x", digest[i]];

    }

NSString *immutableHex = [NSStringstringWithString:hex];

    return immutableHex;

}

+ (NSString *)sha224:(NSString *)input

{

constchar *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:input.length];

uint8_t digest[CC_SHA224_DIGEST_LENGTH];

    CC_SHA224(data.bytes, (CC_LONG)data.length, digest);

NSMutableString* output = [NSMutableStringstringWithCapacity:CC_SHA224_DIGEST_LENGTH * 2];

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

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha256:(NSString *)input

{

constchar *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:input.length];

uint8_t digest[CC_SHA256_DIGEST_LENGTH];

    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);

NSMutableString* output = [NSMutableStringstringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

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

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha384:(NSString *)input

{

constchar *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:input.length];

uint8_t digest[CC_SHA384_DIGEST_LENGTH];

    CC_SHA384(data.bytes, (CC_LONG)data.length, digest);

NSMutableString* output = [NSMutableStringstringWithCapacity:CC_SHA384_DIGEST_LENGTH * 2];

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

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha512:(NSString *)input

{

constchar *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSDatadataWithBytes:cstr length:input.length];

uint8_t digest[CC_SHA512_DIGEST_LENGTH];

    CC_SHA512(data.bytes, (CC_LONG)data.length, digest);

NSMutableString* output = [NSMutableStringstringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];

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

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

#pragma mark - DES

+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data

{

char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeDES,

                                          NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

    }

    free(buffer);

return nil;

}

+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data

{

char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeDES,

                                          NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

    }

    free(buffer);

return nil;

}

#pragma mark - AES256

+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256 + 1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding, keyPtr,

                                          kCCKeySizeAES256, NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

    }

    free(buffer);

return nil;

}

+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256 + 1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding, keyPtr,

                                          kCCKeySizeAES256, NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

    }

    free(buffer);

return nil;

}

#pragma mark - Base64

+ (NSString *)base64EncodedStringWithData:(NSData *)data

{

    if ([data length] < 1) {

        return nil;

    }

    char *characters = malloc((([data length] + 2) / 3) * 4);

    if (characters == NULL)

        return nil;

    NSUInteger length = 0;

NSUInteger i = 0;

    while (i < [data length])

    {

        char buffer[3] = {0,0,0};

        short bufferLength = 0;

        while (bufferLength < 3 && i < [data length])

            buffer[bufferLength++] = ((char *)[data bytes])[i++];

//  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.

        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];

        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];

        if (bufferLength > 1)

相關推薦

iOS開發各種加密方式

這裡封裝的是iOS使用到的各種加密方法,MD5加密,AES加密,Base64加密,DES加密,生成32UUID,類需要繼承 <Foundation/Foundation.h>框架 注意:.m檔案需要匯入 #import <CommonCrypto/

iOS開發各種底層實現--面試必備!

task 源碼 控件 改變 消息發送 釋放內存 retain select 匹配 iOS開發常用技術底層實現(精簡概述) 本章將對ios開發技術底層實現的總結,其實關於ios開發中各種底層的實現,網上相關文章多到數不過來,而不且非常不錯,我也沒有自信我能比他們做的更好,因

iOS開發-MD5加密、SHA1加密

digest ons size encoding gen nco inpu style data 1.MD5加密 ///MD5加密 + (NSString *)md5:(NSString *)inputString{ const char *cStr = [inpu

iOS開發 RSA加密解密與後臺之間的雙向加密詳解

序言 因為專案中需要用到RSA加密,剛開始也是有點亂,這兩天也整理的差不多了,希望能幫到大家。 這次先上程式碼,我想大部分人肯定是著急解決問題,所以不要廢話太多。 iOS端 後臺是PHP,給我了一段公鑰和他用私鑰加密後的base64編碼,讓我先解一下,看看能否解出(請先不要糾結為什麼給我公鑰解密,公鑰私鑰都

IOS開發通過程式碼方式使用AutoLayout (NSLayoutConstraint + Masonry)

        隨著iPhone6/6+裝置的上市,如何讓手頭上的APP適配多種機型多種螢幕尺寸變得尤為迫切和必要。(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhon

Android Wifi --自動連線指定SSID(各種加密方式均可)

Android Wifi API參考網站這裡寫連結內容 1.開始先加入wifi許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >

java各種加密方式

Base64加解密 private static final BASE64Encoder encoder = new BASE64Encoder(); private static final BASE64Decoder decoder = ne

iOS開發RSA加密 和 解密

在iOS中使用RSA加密解密,需要用到.der和.p12字尾格式的檔案,其中.der格式的檔案存放的是公鑰(Public key)用於加密,.p12格式的檔案存放的是私鑰(Private key)用於解密. 首先需要先生成這些檔案,然後再將檔案匯入工程使用,不多說,開始做! 一、使用openssl生成所需祕鑰

iOS開發各種許可權問題(相機、錄音等)

起因 在iOS開發中我們經常會呼叫系統相機和麥克風,但是這些許可權都是使用者可以控制的,當APP沒有許可權呼叫這些手機資源,但是我們沒有判斷,直接去呼叫了,這樣會出現問題。 麥克風許可權 我在專案中開發IM的錄音功能的時候,沒有判斷當前APP是否擁有響應的許可權,導致錄製失

iOS各種加密方法使用簡介

<pre name="code" class="objc"><span style="font-size:18px;color:#cc0000;background-color: rgb(204, 204, 204);">本文主要記載了本文在以往工作

iOS開發各種CG結構體

1、CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>) 中心相同 CG_EXTERN CGRect CGRectInset(CGRect rect

iOS開發常用的加密方式介紹和使用

普通加密方法是講密碼進行加密後儲存到使用者偏好設定中鑰匙串是以明文形式儲存,但是不知道存放的具體位置 一. base64加密 base64 編碼是現代密碼學的基礎基本原理: 原本是 8個bit 一組表示資料,改為 6個bit一組表示資料,不足的部分補零,每 兩個0 用 一個 = 表示用base64 編碼之後

iOS開發-79】利用Modal方式實現控制器之間的跳轉

article 運用 mis cli 控制 present 沒有 dismiss 導航控制器 利用Modal方法。事實上就是以下兩個方法的運用。Modal方式的切換效果是從底部呈現。 -(void)clickModal{ WPViewController *wp

iOS開發中“此證書的簽發者無效”的解決方式

courier data display sina 新浪微博 tracking 項目 text 輸入 iOS開發過程中有時候會出現證書所有變成無效,例如以下圖 然後進行打包的時候會提演示樣例如以下警告: 解決方法: 第一步: 下載ht

iOS代碼加密的幾種方式

red .sh 最簡 應用安全 adr 變量名 尋找 技術分享 混淆 眾所周知的是大部分iOS代碼一般不會做加密加固,因為iOS APP一般是通過AppStore發布的,而且蘋果的系統難以攻破,所以在iOS裏做代碼加固一般是一件出力不討好的事情。萬事皆有例外,不管iOS、a

iOS開發技術之實現tableView左滑刪除的三種操作方式

bject 新名字 app alert ecan sage LEDE dev ati p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #000000; background

淺析 iOS 開發頁面之間資料傳遞的方式

iOS 開發中 VC 之間資料的傳遞和交換可以有很多種方法,下面介紹常見的幾種方式,並且從設計和架構的層次上分析一下不同方法的優缺點和適用場景。內容主要來自於筆者自己在開發中的實踐和思考,如果有錯誤或者遺漏,歡迎聯絡指正。 為了方便描述,我們舉一個實際的用例。假

iOS開發之如何通過路由方式進行頁面間的跳轉

在你的開發過程中,是否遇到過如下的需求: 在tableView型別的展示列表中,點選每個cell中人物頭像都可以跳轉到人物詳情,可參見微博中的頭像,同理包括轉發、評論按鈕、各種連結及linkcard。 跳轉到任意頁面 產品要求,某個頁面的不同banner圖,點選可以跳轉

UITableViewCell初始化的兩種方式iOS開發篇)

 UITableViewCell的兩種初始化方式(dequeueReusableCellWithIdentifier): 1,不註冊cell的方式:       UITableViewCell *cell = [tableView dequeueReusableCellW

iOS 開發之 pdf 文件的載入與瀏覽的 4 種方式

前言 在我們的開發中,有些像電子書型別的app的開發會涉及到pdf文件的載入與展示。由於筆者專案中正好涉及到這塊,於是將pdf常用的幾種載入方式做個總結。以供後面可能用到的同學做個參考。 正文 通常我們用到的pdf文件的載入方式有4種: UIWebView載入本地或者