OpenSSL 提供了完整安全通信所需的編碼工具,諸如雜湊演算法(Hash algorithms)、加解密演算法(Encryption / Decryption algorithms)及 SSL / TLS 協議的實現等。加上其開放源碼的特性,使得許多開源專案或商業套件都有其踪跡。OpenSSL 除了提供程式 API 擴充接口外,也有命令列模式的操作。
本專案主要使用 C 程式語言撰寫,於 Windows / Linux / BSD / MacOS 下皆可運行。
本篇文章為 OpenSSL 系列文章第三篇。常見的加解密演算法分為對稱式與非對稱式,有興趣的使用者,可以在網路上搜尋相關的文章。本章節將介紹 OpenSSL 在非對稱式加解密演算法上的運用。本篇將著重於命令列模式下的非對稱式加解密演算法的操作。
請使用 "genrsa" 為其參數,隨後附上 "-out" 參數指定輸出後的檔案名稱︰
$ openssl genrsa -out private.pem
Generating RSA private key, 512 bit long modulus
.++++++++++++
...++++++++++++
e is 65537 (0x10001)
執行後,OpenSSL 預設會產生長度為 512 bit 的私鑰。
我們可以使用額外指令參數來改成預設的私鑰長度。例如,產生 1024 bit 長度的私鑰,可以在上列指令的最後加上 "1024",如︰
$ openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
.++++++
........................................................++++++
e is 65537 (0x10001)
以此類推,若是 "4096",則︰
$ openssl genrsa -out private.pem 4096
Generating RSA private key, 4096 bit long modulus
......................................................................................++
..................++
e is 65537 (0x10001)
需要注意的是,愈長的私鑰被破解的機率愈低,但是相對地,我們在使用加密與解密的時間也會愈長。使用者可以自行評量。
請使用 "rsa" 為其參數,隨後附上 "-in" 參數指定私鑰檔案,"-out" 參數指定產生的公鑰檔案名稱,"-outform" 參數指定公鑰的輸出格式,以及 "-pubout" 參數結尾︰
$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
writing RSA key
執行後,OpenSSL 會產生 public.pem 的檔案在磁碟中。
請使用 "rsautl" 為其參數,隨後附上 "-encrypt" 參數指定加密的運行,"-inkey" 參數指定密鑰檔案,"-pubin" 參數將公鑰產生於加密檔案中,"-in" 參數指定欲加密的檔案,以及 "-out" 參數指定加密後的檔案名稱︰
$ openssl rsautl -encrypt -inkey public.pem -pubin -in file -out file.rsa
執行後,OpenSSL 會產生 file.rsa 的檔案在磁碟中。
注意,RSA 非對稱式加解密演算法因為先天的限制,無法加密過大的檔案,若遇到此問題時,OpenSSL 會輸出如下的錯誤訊息︰
RSA operation error
13931:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:
若遇到此問題時,最簡單的方式就是使用對稱式的加解密演算法,而不是非對稱式的加解密演算法。
請使用 "rsautl" 為其參數,隨後附上 "-decrypt" 參數指定解密的運行,"-inkey" 參數指定密鑰檔案,"-in" 參數指定欲解密的檔案,以及 "-out" 參數指定解密後的檔案名稱:
$ openssl rsautl -decrypt -inkey private.pem -in file.rsa -out file
執行後,OpenSSL 會產生 file 的檔案在磁碟中。
本篇範例介紹了 RSA 非對稱式加解密檔案的操作。當然除了本系列文章的介紹外,OpenSSL 還提供許多好用的功能,就請使用者自行探索囉。