在 Linux 下使用自然人憑證解密檔案

緣起

因為工作的關係,不小心接觸了GCA憑證,主要用來以RSA加解密之用。目標就是使用憑證公鑰進行加密,再用CA憑證解密,其中使用的憑證是機關憑證,類似自然人憑證那種卡片。

這種東西,其實真的很不方便,但是安全性比較能說服某些主管,起碼,憑證的保護足夠的,也比較不容易不小心被散佈出去,也很難備複製。

總之,結論就是要用...

開使了相關的研究之路,儘量記起來供大家可以參考。

研究採用GTestCA的開發套件,這是別人告知的,大概是6k,可以拿到普通光碟燒的HiSecure SDK(Windows, Linux, JAVA)、幾個軟體、測試卡片6張。

GTestCA develop package

一開始而本人只想再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