iOS App中 使用 OpenSSL 庫

來源:互聯網
上載者:User

標籤:

轉自:http://blog.csdn.net/kmyhy/article/details/6534067

 

在你的 iOS App中 使用 OpenSSL 庫

——譯自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library”

原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/,本文有少許地方做了調整。

1、下載OpenSSL原始碼庫:

http://www.openssl.org/source/

當前最新版本1.0.0d。

下載後,將其中的 openssl-1.0.0x 目錄解壓出來放在合適的地方。

2、編譯OpenSSL

openssl是一個c語言函數庫,為方便在Xcode中使用,我們需要把它編譯為靜態庫。

開啟crypto/ui/ui_openssl.c進行編輯。

static volatile sig_atomic_t intr_signal;

 

修改為:

static volatile int intr_signal;

 

否則會出現一個編譯錯誤。

2.1 編譯 i386 庫(用於iPhone模擬器)

執行以下命令:

mkdir ssllibs

 

將在使用者主目錄下建立ssllibs目錄。

切換到openssl-1.0.0a安裝(解壓)目錄,在其下建立3個子目錄:

cd openssl-1.0.0a

mkdir openssl_armv6 openssl_armv7 openssl_i386

 

執行目錄下的congfigure:

./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_i386

 

編輯 makefile 檔案,找到:

CC= gcc

修改為:

CC= /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386

 

下一行,在CFLAG = 的後面增加

-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk

 

進行編譯:

make

make install

 

檢查 openssl_i386/lib目錄下 libcrypto.a 和 libssl.a 是否產生。

2.2 編譯 armv6 庫(armv6架構的iOS使用)

先將編譯好的 i386 庫儲存到 ssllibs 目錄:

mv openssl_i386 ../ssllibs

 

清除上次編譯的配置:

make clean

 

執行configure,重建新的編譯配置:

./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_armv6

 

修改 makefile 檔案,將 CC=gcc修改為:

CC= /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv6

 

注意,這裡是iPhoneOS.platform而不是先前的 iPhoneSimulator.platform了。

同樣,需要在CFLAG=後面加上:

-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk

可以進行編譯了:

make

make install

 

檢查 openssl_armv6/lib 目錄下 libcrypto.a 和 libssl.a 是否產生。

2.3 編譯 armv7 庫(armv7 架構的 iOS 使用)

先將先前編譯好的 armv6 庫移到 ssllibs 目錄。

mv openssl_armv6 ../ssllibs

 

清除前面編譯配置:

make clean

 

執行configure配置編譯環境:

./configure BSD-generic32 --openssldir=/Users/<username>/openssl-1.0.0a/openssl_armv7

 

修改 makefile 檔案,將 CC=cc修改為:

CC= /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv7

 

注意,gcc 編譯選項 arch 由 armv6 變為了 armv7。

同時,在CFLAG=後面添加:

-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk

 

進行編譯:

make make

install

 

檢查 openssl_armv7/lib 目錄下 libcrypto.a 和 libssl.a 是否產生。

把編譯結果移到ssllibs目錄:

mv openssl_armv7 ../ssllibs

 

2.4 製作“通用”靜態庫

通用靜態庫是一個“多架構”檔案,它是多個單一架構靜態庫的融合。

製作“通用”靜態庫需要使用 Mac OS X 的 lipo 命令(具體請參考 Mac OS X 手冊)。

合并 libcrypto.a 庫:

lipo -create ../ssllibs/openssl_i386/lib/libcrypto.a ../ssllibs/openssl_armv6/lib/libcrypto.a ../ssllibs/openssl_armv7/lib/libcrypto.a -output ../ssllibs/libcrypto.a

 

合并 libssl.a 庫:

lipo -create ../ssllibs/openssl_i386/lib/libssl.a ../ssllibs/openssl_armv6/lib/libssl.a ../ssllibs/openssl_armv7/lib/libssl.a -output ../ssllibs/libssl.a

 

3、在 Xcode 項目的進行設定

把 OpenSSL 的 include 目錄拷貝到專案檔夾。

把 libcrypto.a 和 libssl.a 檔案拷貝到專案檔夾。

把 libcrypto.a 和 libssl.a 檔案拖到項目的 Framework 組中。

在 target 上右鍵,選擇 Get Info,將 Library Search Path 設定為:

$(inherited) “$(SRCROOT)”

 

將 User Header Search Paths 設為 include。

選中 Always Search User Paths 選項。

現在可以在你的iPhone項目中實用OpenSSL了。

4、寫一個應用 OpenSSL 的小例子

建立 Window-based application,命名為OpenSSLTest.

“Add à Existing Frameworks à Others…”,把libssl.a和libcrypto.a加進來(即我們前面製作的“通用”庫)。

開啟項目info 的 Build 設定,在 Header Search Paths 中加入 OpenSSL 的標頭檔路徑,如:

/Users/<yourname>/Library/openssl-1.0.0a/include

注意,勾上“Recursive”(搜尋子目錄)。

接下來寫點簡單的代碼。為求省事,我們把所有代碼寫在main.m裡:

#import <UIKit/UIKit.h>

#include <Openssl/md5.h>

void Md5( NSString *);

int main( int argc, char *argv[]) {

    

    NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ];

Md5 ( @"12345" );

    int retVal = UIApplicationMain (argc, argv, nil , nil );

    [pool release ];

    return retVal;

}

 

void Md5( NSString * string){

// 輸入參數 1 :要產生 md5 值的字串, NSString-->uchar*

    unsigned char *inStrg = ( unsigned char *)[[string dataUsingEncoding :NSASCIIStringEncoding ] bytes];

    // 輸入參數 2 :字串長度

unsigned long lngth = [string length ];

// 輸出參數 3 :要返回的 md5 值, MD5_DIGEST_LENGTH 為 16bytes , 128 bits

unsigned char result[ MD5_DIGEST_LENGTH ];

// 臨時 NSString 變數,用於把 uchar* 組裝成可以顯示的字串: 2 個字元一 byte 的 16 進位數

NSMutableString *outStrg = [ NSMutableString string ];

// 調用 OpenSSL 函數

      MD5 (inStrg, lngth, result);

    unsigned int i;

    for (i = 0 ; i < MD5_DIGEST_LENGTH ; i++)

    {

        [outStrg appendFormat : @"%02x" , result[i]];

    }

NSLog ( @"input string:%@" ,string);

NSLog ( @"md5:%@" ,outStrg);

}

你可以在控制台查看程式的輸出:

input string:12345

md5:827ccb0eea8a706c4c34a16891f84e7b

 

iOS App中 使用 OpenSSL 庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.