【Charm-Crypto】開發環境保姆級搭建教程
博主的科研方向是基於雙線性對映的公鑰密碼設計,主要包括基於身份和基於屬性的加密演算法、簽名演算法。在高校期間由於專案需要主力開發語言一直是java,所以演算法模擬主要都是通過Java Pairing Based Cryptography庫(JPBC)去實現的。最近一直在用Python做一些資料分析方面的工作,包括利用SciKit-Learn和Tensorflow去做機器學習以及深度學習演算法的研發,於是充分感受到了Python簡潔的語法和豐富的第三方庫帶來的爽快體驗。考慮到後面可能會將兩個領域進行一定程度的結合,所以希望將原先的密碼學開發環境轉移到Python生態下。
在GitHub上溜達一陣子後果然發現了一個叫Charm-Crypto的專案。它是一個基於Python語言的密碼學設計框架,用於快速原型設計先進的密碼系統。常用的基礎密碼庫基本都有支援,包括對稱加密、訊息摘要、數字簽名等。檢視模組說明才發現,好傢伙竟然有身份基密碼系統和屬性基密碼系統的實現。除此之外,Charm-Crypto的底層是C語言開發的庫,所以理論上各種演算法的執行還是比較快的。
Charm-Crypto專案本身有些年頭了,相容的作業系統和依賴也大多是老版本。例如Charm-Crypto官網宣告支援的Ubuntu版本最高只能到13.04。這裡就手把手幫助各位在Ubuntu 18.04 上搭建一個基於Python3的Charm-Crypto開發環境。
一、安裝基礎依賴
1、通過以下兩條指令檢查系統是否安裝了gcc
、make
、perl
gcc -v
make -v
perl -v
正常安裝之後會顯示兩個工具的版本資訊:
gcc
版本資訊:
make
版本資訊:
perl
版本資訊:
如果沒有的話,就通過以下指令安裝:
sudo apt-get install gcc sudo apt-get install make sudo apt-get install perl
版本的話沒有嚴格要求,儘量和我的保持一致。
2、安裝依賴庫m4
、flex
、bison
執行以下指令進行安裝:
sudo apt-get update
sudo apt-get install m4 flex bison
3、安裝Python的依賴包python3-setuptools
、 python3-dev
、libssl-dev
執行以下指令進行安裝:
sudo apt-get install python3-setuptools python3-dev libssl-dev
4、安裝Python第三方包pyparsing
首先安裝python3-pip
sudo apt-get install python3-pip
然後通過pip3
指令安裝pyparsing
,這裡最好指定一下版本。因為Charm-Crypto專案本身有些年頭了,本身相容的作業系統和依賴也都是老版本,而且考慮到專案需要最終我選擇的是老版本2.4.6。
pip3 install pyparsing==2.4.6
二、編譯安裝OpenSSL1.0.0
Charm-Crypto官網上可以看到,該框架原先的編譯安裝依賴於OpenSSL 1.0.0環境。0.50版本的更新記錄顯示,目前已經修復了在OpenSSL 1.1.0環境下引起編譯錯誤的問題。所以不管你的OpenSSL版本是1.0.0還是1.1.0,應該都是可以順利完成編譯安裝的。我為了保險起見還是更換了OpenSSL版本,如果有出現編譯不成功可以參考這裡的步驟。
先檢視Ubuntu 18.04自帶的OpenSSL版本:
openssl version
發現Ubuntu自帶的OpenSSL版本是1.1.1:
經過我的試驗最終選擇將版本更換為1.0.0s,這個版本保證可以在Ubuntu 18.04上面成功編譯安裝。
附上OpenSSL官網的下載連結。
下載完成後按照下面的步驟一步步進行:
1、將壓縮包openssl-1.0.0s.tar.gz
解壓至/usr/local/src/
目錄
cd ~/Downloads/
sudo tar -zxvf openssl-1.0.0s.tar.gz -C /usr/local/src/
2、寫入編譯配置
cd /usr/local/src/openssl-1.0.0s/
sudo ./config shared --prefix=/usr/local/openssl --openssldir=/usr/lib/openssl
其中:
shared
:表示生成動態庫,這個欄位一定不要忘了,後面會對生成的動態庫做進一步的操作。prefix
:表示安裝路徑,為了避免各種軟體混雜在一起,我就為OpenSSL單獨建立了路徑/usr/local/openssl
openssldir
:表示配置檔案目錄(Ubuntu預設是/usr/lib/openssl
,若設定其他目錄,執行openssl命令時會有警告)
配置寫入成功的話會顯示如下的資訊:
4、編譯
成功寫入配置後,執行以下指令進行編譯:
cd /usr/local/src/openssl-1.0.0s/
sudo make
指令執行完畢如果顯示如下資訊就表示編譯成功:
5、安裝
成功編譯後,執行以下指令進行安裝:
cd /usr/local/src/openssl-1.0.0s/
sudo make install
指令執行完畢如果顯示如下資訊就表示安裝成功:
我們根據先前配置的安裝路徑,就能看到OpenSSL已經順利安裝好了:
接下來要做的就是用安裝好的OpenSSL 1.0.0s去替換自帶的OpenSSL 1.1.1。
6、建立軟連結
執行以下指令,通過軟連結將OpenSSL 1.0.0s的命令和庫檔案連結到系統:
sudo mv /usr/bin/openssl /usr/bin/openssl.bak
sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
sudo ln -s /usr/local/openssl/include/openssl /usr/include/openssl
7、動態庫相關配置:
- 配置動態庫軟連結:
sudo ln -s /usr/local/openssl/lib/libssl.so.1.0.0 /usr/lib/libssl.so
sudo ln -s /usr/local/openssl/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so
- 重新整理動態庫配置
/etc/ld.so.conf
sudo gedit /etc/ld.so.conf
在配置末尾增加一行,寫入include /usr/local/openssl/lib
然後儲存退出。
8、測試
openssl version
如果安裝成功,執行以上命令後會顯示此時OpenSSL的版本號已經變為1.0.0s:
這裡再次重申幾點:
- 版本最好保持在1.0.0s,經過我的測試這個版本是可以在Ubuntu 18.04上正常編譯安裝的。
- 不要解除安裝原來的OpenSSL,解除安裝OpenSSL是很危險的(會破換掉很多軟體的依賴,導致其他軟體無法執行),這裡僅僅是做了版本切換。
- 因為OpenSSL版本切換後會導致所有HTTPS的請求失敗,例如apt的軟體源地址原來都是HTTPS協議的,現在有可能導致無法執行軟體源更新的操作。處理辦法是將所有HTTPS請求修改為HTTP請求。不過為了不影響其他軟體和開發環境,我建議是用單獨的虛擬機器或者docker容器搭建本套環境。
三、編譯安裝GMP
GMP是一個提供高精度算術的開源軟體庫,支援對有符號整數、有理數和浮點數進行運算。目前GMP官網提供的版本是6.2.1,我在下載連結中找到了歷史版本的索引倉庫,最終選擇的版本是5.1.3:
1、下載好之後先解壓到/usr/local/src
路徑下
cd ~/Downloads
sudo tar -jxvf gmp_5.1.3.tar.bz2 -C /usr/local/src
2、寫入配置
cd /usr/local/src/gmp-5.1.3
sudo ./configure
這裡不需要更改任何配置,基本不會什麼問題。寫入後會顯示如下資訊:
3、編譯
執行下面的指令進行編譯:
cd /usr/local/src/gmp-5.1.3
sudo make
編譯一會兒就能結束,會顯示如下資訊:
4、安裝
執行下面的指令:
cd /usr/local/src/gmp-5.1.3
sudo make install
安裝成功後會顯示如下資訊:
四、編譯安裝PBC
PBC全稱是Pairing-Based Cryptography library,是一個基於GMP構造的C語言庫。PBC支援建立各類離線橢圓曲線並建立例如雙線性配對和多線性配對運算。我在官網下載的是最新版本0.5.14:
1、下載好之後解壓到/usr/local/src
路徑下
cd ./Downloads
sudo tar -zxvf pbc-0.5.14.tar.gz -C /usr/local/src/
2、寫入配置
這裡也不需要修改配置,直接執行以下命令即可:
cd /usr/local/src/pbc-0.5.14/
sudo ./configure
寫入成功後顯示如下資訊:
3、編譯
執行以下指令進行編譯:
cd /usr/local/src/pbc-0.5.14/
sudo make
編譯成功會顯示如下資訊:
4、安裝
cd /usr/local/src/pbc-0.5.14/
sudo make install
安裝成功後可以在終端裡找到這樣的顯示資訊:
五、編譯安裝Charm-Crypto
經過以上的部署工作,終於可以面對Charm-Crypto本尊了。在Charm-Crypto官網上看到的安裝教程只能支援到Ubuntu13.04。
經過嘗試我最終還是放棄了,Ubuntu官方早就不維護13.04版本了,非官方的軟體源更是幾乎沒有。網上也有部落格介紹了和官網類似的方法在16.04,18.04上面成功安裝,可惜我還是失敗了。好在最後我利用GitHub上0.50版本的dev原始碼還是成功安裝了。
1、下載並解壓到/usr/local/src
路徑下
在GitHub可以看到這2點資訊,一個是目前dev版本通過build測試,理論上應該沒有大問題,而dev-2.7版本build失敗。
所以大夥下載原始碼的時候注意一下版本:
另一個是目前dev版本只支援Python3:
正好我的程式碼主要都是基於Python3編寫,自然基於以上幾點我就直接選擇dev版本了。
下載後還是解壓到/usr/local/src
路徑下:
cd ~/Downloads
sudo mv ./charm-dev.zip /usr/local/src/
cd /usr/local/src/
sudo unzip ./charm-dev.zip
2、寫入編譯配置
直接執行以下命令寫入編譯配置,不需要任何修改:
cd /usr/local/src/charm-dev/
sudo ./configure.sh
寫入成功後會顯示如下資訊:
3、編譯
成功寫入編譯配置後,執行以下命令進行編譯:
cd /usr/local/src/charm-dev/
sudo make
這一步應該沒什麼問題,編譯完成後會顯示如下資訊:
4、安裝
執行以下命令進行最後的安裝:
cd /usr/local/src/charm-dev/
sudo make install
順利安裝完應該可以看到以下資訊:
六、啟動Python驗證安裝
進行到這裡,部署工作就基本大功告成了。下面驗證一下安裝成果,在終端啟動Python3:
python3
啟動後嘗試import:
import charm
如果沒有報錯,那麼恭喜你正式大功告成,可以開始愉(jian)快(nan)地開發啦。
七、總結
Charm-Crypto專案已經有一些年頭,不過密碼學到底還是一個門檻比較高的方向,導致這個專案的進度一直比較慢。隨著個人資訊保安意識的提升以及全行業資料隱私保護制度的規範,在今後的資料分析行業裡一定會更加註重資料探勘與資料保護的平衡。這種平衡如何實現其實各家有各家的說法,具體來說我為了資料分析妥協了密碼設計,選擇將開發整體遷移到Python生態當中。當然也有大牛選擇在Java生態下進行機器學習的開發,例如採用DeepLearning4j等。沒有誰好誰壞之說,決定了就做下去吧。