緣起
因為工作的關係,不小心接觸了GCA憑證,主要用來以RSA加解密之用。目標就是使用憑證公鑰進行加密,再用CA憑證解密,其中使用的憑證是機關憑證,類似自然人憑證那種卡片。
這種東西,其實真的很不方便,但是安全性比較能說服某些主管,起碼,憑證的保護足夠的,也比較不容易不小心被散佈出去,也很難備複製。
總之,結論就是要用...
開使了相關的研究之路,儘量記起來供大家可以參考。
研究採用GTestCA的開發套件,這是別人告知的,大概是6k,可以拿到普通光碟燒的HiSecure SDK(Windows, Linux, JAVA)、幾個軟體、測試卡片6張。
一開始而本人只想再Linux作業,所以選擇了 GTestCA中的 HiSECURE SDK 作為開發的一部份,因為有寫支援Linux,雖然大部份人都不知道,實際上我一開始用也以為不行XD。
拿到光碟後可以看到裏面有哪些東西呢:
HiCOS_Client_v2.1.9.zip
Hi-Secure_1.2.0.15.zip
HiSECURE_C_API_TEST_v1_981015.zip
HiSecure_6.5.7_GPKI
HiSecure_7.0.7_GPKI
HiSecureJava2.2版
首先HiCOS 主要是Windows的軟體,可以測試憑證密碼什麼的
接著再Windows初步測試,可以用HiSECURE_C_API_TEST_v1_981015.zip裏面的 HISECURE_CryptoModule.exe,它可以卡片憑證用來 sign/verify, encryot/decrypt ... 等。
垃圾講完了,接下來全部跳過Windows, 會以Kinux為主。
加密
這邊很簡單的示範加密。
先到 GTestCA 利用 憑證查詢及下載功能 取得公鑰,再用來加密檔案。
依照網頁的步驟輸入卡號,用查詢的方式找到卡片,選擇有加密功能的公鑰,然後下載。
下載的檔案假設是 gcapub.cer
使用 openssl 可以把憑證公鑰取出
openssl x509 -inform der -in gcapub.cer -pubkey -noout > gtestca_publickey.pem
測試加密
echo "AAA" > file
openssl rsautl -encrypt -inkey gtestca_publickey.pem -pubin -in file -out file.rsa
完成後 file.rsa 就是加密檔案。以上,是最簡單的部份,接下來是重點,怎麼用API解密。
解密
首先,因為憑證的關係,openssl沒有辦法直接讀取卡片內的私鑰,也沒有辦法把卡片內的私鑰讀取到電腦,再用openssl處理,所以只能用API的方式,直接讀取卡片私鑰,進行解密。
編譯 HiSecure SDK
首先,要讓HiSecure可以在Linux上編譯執行。第一個限制就是只支援32位元x86,害我還要弄個32位元環境。
有了32位元環境之後,需要安裝依些套件,這邊以我自己熟悉的Debian Jessie 32bit 來示範。
先裝 基本開發套件 make 等等
apt-get install build-essential
再裝 pcsc 相關套件
apt-get install libccid libpcsclite-dev libpcsclite1 pcscd libpcsc-perl pcsc-tools
編譯前,先到 HiSecure_7.0.7_GPKI/example 目錄,檔案如下:
DeidDekey TestCRL.cpp TestOCSP.cpp
HashAndSymEncryption.cpp TestCert.cpp aaa
HiSecure.dll TestHiSecure.cpp deid_dekey.cpp
MOICA.cer TestHiSecure.dsp example.xcodeproj
MOICA_User.cer TestHiSecure.dsw key.p8b
Makefile TestHiSecure.exe libHicos_p11v1.dylib
PKCS8SoftKey.cpp TestHiSecure.h libHicos_p11v1.so
TestAsym.cpp TestHiSecure.sln primaryk.key
TestBasic.cpp TestHiSecure.vcproj testHiSecure.bin
其中 Test*.cpp 是主要的範例檔原始碼,可以看怎麼呼叫HiSecureAPI的最好示範,預設值接下make會根據makefile編譯出testHiSecure.bin,是主要的示範程式,作用是:
./testHiSecure.bin
1:List readers and cards // 列出讀卡機
2:List keys // 列出 key 卡片
3:PKCS1 Encrypt/decrypt // 以 mydata字串加解密,建議點選以上作為測試
4:PKCS1 Sign/verify //驗證
5:Get certificate from IC card //以下不感興趣....
6:Parse MOICA Certificate
7:Parse MOICA CRL
8:Check MOICA Certificate
9:OCSP
a:Hash & Symmetric Encryption Example
b:Get PKCS8 Key Example
0:Quit // 離開
Enter your choice:
其中加解密主要是呼叫 BasicAsymEncrypt BasicAsymDecrypt 來進行,可以參考 TestAsym.cpp。
因為我想要解密檔案並且存檔到另一個檔案,所以寫了 deid_dekey.cpp 和 makefile,我的部份程式再這邊可以取得: https://github.com/Thomas-Tsai/HiSecureinLinux
下載 deid_dekey.cpp makefile 到 example 目錄,執行 make
make
rm -f *.o
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestHiSecure.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestBasic.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestCert.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestCRL.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestOCSP.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c TestAsym.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c PKCS8SoftKey.cpp
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c HashAndSymEncryption.cpp
g++ -g -o testHiSecure.bin TestHiSecure.o TestBasic.o TestCert.o TestCRL.o TestOCSP.o TestAsym.o PKCS8SoftKey.o HashAndSymEncryption.o -L../lib/Linux -L./ -lHiSecure -lpkcs11lib -lcrypto -ldl -lHicos_p11v1
g++ -g -Wno-write-strings -Wno-unused-result -I. -I../include -I../openssl_linux -c deid_dekey.cpp
g++ -g -o DeidDekey deid_dekey.o TestBasic.o TestCert.o TestCRL.o TestOCSP.o TestAsym.o PKCS8SoftKey.o HashAndSymEncryption.o -L../lib/Linux -L./ -lHiSecure -lpkcs11lib -lcrypto -ldl -lHicos_p11v1
編譯好之後,還要記得把 libHicos_p11v1.so 複製到 /usr/lib/libHicos_p11v1.so.1
cp libHicos_p11v1.so /usr/lib//usr/lib/libHicos_p11v1.so.1
之後執行才會正常。
實際進行解密檔案
./DeidDekey 密文 明文 PIN
./DeidDekey file.rsa file.plain 12345678
cat file.plain
AAA
以上,其實 HiSecure library 在 Linux 上是可以跑的,API也不會很複雜,希望對國內 Linux developer 有點幫助摟
reference
- http://www.openfoundry.org/en/tech-column/8615-opensource-security-algorithm-tool-openssl3-rsa-symmetric-encryption-and-decryption-algorithms
- http://gtestca.nat.gov.tw
Comments