• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            huyutian

            他強由他強,清風拂山崗;他橫由他橫,明月照大江。他自狠來他自惡,我自一口真氣足

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              20 隨筆 :: 47 文章 :: 22 評論 :: 0 Trackbacks

                   最近在分析一個軟件時需要用到加密算法,然后在網上搜索了一下,對比了網上的幾個開源的加密庫,最后選定OpenSSL。OpenSSL是用C寫的,但包含有很多面向對象的特征,而且代碼效率很高。個人覺得比起CryptPP庫來容易理解,也易于使用。CryptPP是用C++寫的,類的繼承關系太復雜,類庫代碼調試、分析較難。而且OpenSSL還可以根據要求定制編譯,比如某些不需要的加密算法可以屏蔽掉,這樣裁減出來的庫尺寸會小一些。下面說說我的OpenSSL的編譯。
            OpenSSL在Windows下的編譯,如果使用默認配置其實不難。大致分三步,下載openssl源代碼和安裝Perl就不說了。
            1)perl Configure VC-WIN32
            2)ms\do_masm
            3)執行nmake -f ms\nt.mak生成靜態庫,或者執行nmake -f ms\ntdll.mak生成動態庫,在nmake之前最好先到VC安裝目錄下運行一下vcvar32.bat重新設置一下編譯的路徑和環境變量。
            但是如果是定制編譯就比較難了,摸索了很長時間,經常出現編譯錯誤。直到無意中看了一下openssl目錄下的INSTALL.W32,很多答案才找到。
            這是一個教訓啊,看來,什么東西拿到手上都應該仔細看看,而不應該拿到就想馬上上手,這樣反而可能還要多走一些彎路。很多時候盲目的在網上搜索問題的解決辦法,還不如老老實實研究自帶的幫助和說明,苦苦尋找的答案可能就在其中。其實開始我也不是沒有看INSTALL.W32這個文檔,只是不太仔細,只看了前面的編譯方法,沒看后面的Troubleshooting。個人認為要定制編譯OpenSSL,Troubleshooting一節很重要,就用google翻譯了一下,放在這里以免遺忘。


            疑難排解
            由于Win32下的編譯只是偶爾進行測試,可能并不總是編譯干凈。當您運行MS \ do_ms,如果得到一個有關函數沒有指定序號錯誤,
            那么這意味著在Win32原始文件過期。你可以:
            > perl util\mkdef.pl crypto ssl update
            然后,ms\do_xxx不應再警告了。然而這種方法得到的序號可能不能匹配CVS樹指定的序號,所以任何對這個版本的庫的鏈接可能需要重新編譯。
            如果你的錯誤是有關不能解析符號變量的(unresolved symbols),有幾種可能的原因。
            如果你已禁用某些加密算法,該DLL被鏈接時發生這種情況,則有可能是DEF文件生成時沒有清除所有關閉的符號。最簡單的辦法是編輯DEF文件手動將其刪除。DEF文件是 ms\libeay32.def和ms\ ssleay32.def。
            另一個原因是,你略過了上面提到的missing numbers錯誤。
            如果出現警告,編譯將會停止。
            出現任何警告,Win32默認的Makefile將會停止。由于VC + + 對待警告有自己的做法,并不一定與其他環境發生這種情況時相符。最好的解決方法是編輯有警告的文件并修復它。或者,也可以通過編輯Makefile中CFLAG行,刪除/WX選項,來關閉警告。

             您可能會得到編譯錯誤。同樣你要修復這些或報告他們。

             編譯連接OpenSSL庫的應用程序,如果你不使用多線程DLL運行時庫(/md選項)您的程序幾乎肯定會崩潰,因為malloc陷入混亂-在
              OpenSSL DLL靜態鏈接到一個版本,應用程序必須使用同一個版本。加CRYPTO_malloc_init()到程序調用OpenSSL庫之前,可能能夠解決這些問題 :這會告訴OpenSSL庫使用與應用程序相同的malloc(),free()和realloc()。但是OpenSSL調用的很多標準庫函數內部用到malloc()
              (例如fopen()函數),OpenSSL不能改變這些,所以一般不能依靠CRYPTO_malloc_init()解決您的問題,您應該 堅持用多線程庫。


            連接應用程序
            如果您鏈接靜態OpenSSL庫[built with ms/nt.mak],那么你需要額外鏈接WSOCK32.LIB,ADVAPI32.LIB,GDI32.LIB和USER32.LIB。這些開發非交互式服務應用程序可能會關注后兩個庫的連接,因為他們僅與交互桌面相關,對服務進程不可用。該工具包的設計檢測它的目前執行的,GUI,控制臺應用程序或服務,并采取相應的行動,即是否實際上使 圖形用戶界面調用。

             如果您鏈接使用OpenSSL.DLLs,那么希望你將連接OpenSSL BIO layer和編譯器運行時庫的小“墊片”片段包含到您的應用程序代碼。更多詳情查一查OPENSSL_Applink引用頁。

             



            對OpenSSL的Win32編譯環境可以進行多種調整。默認情況下是不編譯調試符號的。編譯調試符號需要在do_*批處理文件中添加'debug' 到 mk1mf.pl行。注意mk1mf.pl需要platform是命令行的最后一個參數,所以'debug'必須出現在此之前。

            0.9.8 OpenSSL默認編譯ENGINES到libeay32.dll庫。如果在命令行對Configure 指定了“no-static-engine”選項,共享庫構建時(ms\ntdll.mak)將編譯
            engines作為單獨的DLL。

             默認Win32環境是略去任何Windows NT特征。如果你想OpenSSL允許NT特征(目前只logging BIO)按照上述操作,但調用批處理文件時用do_nt.bat 代替do_ms.bat。

             

            posted on 2009-11-13 12:38 胡雨田 閱讀(12498) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程
            久久狠狠高潮亚洲精品| 久久99精品久久久久久9蜜桃| 精品多毛少妇人妻AV免费久久| 欧美日韩中文字幕久久伊人| 亚洲精品高清久久| 99久久免费国产精品特黄| 久久精品日日躁夜夜躁欧美| 热re99久久精品国99热| 国产伊人久久| 无码国内精品久久人妻蜜桃| 99久久99久久精品国产片| 久久久久亚洲av成人网人人软件 | 性做久久久久久久久浪潮| 久久这里都是精品| 久久国产高清字幕中文| 99久久综合国产精品免费| 国产L精品国产亚洲区久久| 人妻精品久久无码区| 久久精品人妻一区二区三区| 国产美女久久精品香蕉69| 香蕉久久夜色精品国产2020| 久久se这里只有精品| 国产一区二区精品久久 | 久久精品aⅴ无码中文字字幕不卡| 久久人人爽人人爽人人片AV麻豆| 久久久久久无码Av成人影院| 日日狠狠久久偷偷色综合96蜜桃| 99精品国产在热久久无毒不卡| 怡红院日本一道日本久久| 久久精品国产99久久久| 亚洲精品白浆高清久久久久久| 久久伊人影视| 亚洲国产日韩欧美久久| 国产午夜福利精品久久| 久久久久久综合一区中文字幕| 无码人妻久久一区二区三区| 亚洲日本va中文字幕久久| 精品国产青草久久久久福利| 色妞色综合久久夜夜| 久久久久久综合网天天| 久久午夜伦鲁片免费无码|