1. 程式人生 > >iOS系統提供的RSA 不對稱加密和解密和對稱加密解密

iOS系統提供的RSA 不對稱加密和解密和對稱加密解密

對iOS平臺下使用CommonCrypto與Security.framework的加密與解密,簽名與簽名的基本技術進行了總結。

主要實現了以下功能

1.非對稱加密演算法

RSA

包含公私鑰的生成、公鑰加密、私鑰解密、私鑰簽名、公鑰驗籤功能。證書資訊的讀取。以及金鑰在KeyChain中儲存,查詢,刪除等功能。

2.對稱加密演算法

DES、3DES、AES

主要實現加密與解密功能。

3.雜湊演算法

SHA1、SHA224、SHA256、SHA384、SHA512 
MD2、MD4、MD5

以下是詳細的說明。

首先,從非對稱加密演算法開始,在開發的過程中引用以下標頭檔案就足夠了

<Security/Security.h>

1.Security.framework中的基本資料型別

SecCertificateRef-X.509證書 .cer或者.der檔案 
SecIdentityRef-同時包含私鑰與公鑰證書資訊 .p12檔案或者.pfx檔案 
SecKeyRef-代表一個加密金鑰,私鑰或者公鑰 
SecTrustRef-X.509證書策略 
SecPolicyRef-X.509證書信任服務 
SecAccessControlRef-某個物件的訪問控制權限

2.Security.framework中方法執行後的狀態結果資訊

CF_ENUM(OSStatus)
{
errSecSuccess                               = 0,       
/* No error. */
errSecUnimplemented                         = -4,      
/* Function or operation not implemented. */
errSecIO                                    = -36,     
/* I/O error (bummers) */
errSecOpWr                                  = -49,     
/* file already open with with write permission */
errSecParam                                 = -50,     
/* One or more parameters passed to a function where not valid. */
errSecAllocate                              = -108,    
/* Failed to allocate memory. */
errSecUserCanceled                          = -128,    
/* User canceled the operation. */
errSecBadReq                                = -909,    
/* Bad parameter or invalid state for operation. */
errSecInternalComponent                     = -2070,
errSecNotAvailable                          = -25291,  
/* No keychain is available. You may need to restart your computer. */
errSecDuplicateItem                         = -25299,  
/* The specified item already exists in the keychain. */
errSecItemNotFound                          = -25300,  
/* The specified item could not be found in the keychain. */
errSecInteractionNotAllowed                 = -25308,  
/* User interaction is not allowed. */
errSecDecode                                = -26275,  
/* Unable to decode the provided data. */
errSecAuthFailed                            = -25293,  
/* The user name or passphrase you entered is not correct. */
};

3.讀取證書檔案,從資料流到證書型別SecCertificateRef的轉換 

<Security/SecCertificate.h>

SecCertificateCreateWithData

4.從證書中獲取公鑰SecKeyRef

<Security/SecPolicy.h>

SecPolicyCreateBasicX509         //建立SecPolicyRef

<Security/SecTrust.h>

SecTrustCreateWithCertificates   //建立SecTrustRef            
SecTrustCopyPublicKey            //從SecTrustRef中拷貝公鑰

5.讀取私鑰檔案,從資料流到SecIdentityRef的轉換

SecPKCS12Import    //私鑰資料流檔案匯入keychain

6.從私鑰檔案中獲取私鑰

SecIdentityCopyPrivateKey //從SecIdentityRef拷貝私鑰

7.加密與解密主要使用了以下四個函式

<Security/SecKey.h>

SecKeyEncrypt          //加密
SecKeyDecrypt          //解密
SecKeyRawSign          //簽名
SecKeyRawVerify        //驗籤

8.生成公私鑰對,儲存或者不儲存到鑰匙串

<Security/SecKey.h>

SecKeyGeneratePair

其次,為對稱加密演算法。

在開發過程中需要引用以下標頭檔案

<CommonCrypto/CommonCrypto.h>

主要有如下兩個思路 

順序呼叫以下函式

CCCryptorCreateWithMode     //建立CCCryptorRef物件
CCCryptorUpdate
CCCryptorFinal              //並已定需要呼叫該方法

另外兩個函式的說明

CCCryptorGetOutputLength    //獲取密文輸出緩衝區長度
CCCryptorRelease            //釋放CCCryptorRef物件

或者直接呼叫以下函式完成加密過程

CCCrypt 

最後,為雜湊演算法。

雜湊演算法的計算流程大致相同。方法宣告在這裡

<CommonCrypto/CommonDigest.h>

以SHA1為例,有兩個思路

順序呼叫以下函式

CC_SHA1_Init
CC_SHA1_Update
CC_SHA1_Final

或者直接呼叫以下函式

CC_SHA1

HMAC是金鑰相關的雜湊運算訊息認證碼(Hash-based Message Authentication Code),HMAC運算利用雜湊演算法,以一個金鑰和一個訊息為輸入,生成一個訊息摘要作為輸出。

其支援SHA1和MD5兩種雜湊演算法

方法宣告在這裡

<CommonCrypto/CommonHMAC.h>

順序呼叫以下函式

CCHmacInit            
CCHmacUpdate
CCHmacFinal

或者直接呼叫以下函式

CCHmac