登入  |  English
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
技術專欄 開放源碼的安全演算法工具: OpenSSL (3) - RSA 非對稱式加解密演算法

開放源碼的安全演算法工具: OpenSSL (3) - RSA 非對稱式加解密演算法

前言

OpenSSL 提供了完整安全通信所需的編碼工具,諸如雜湊演算法(Hash algorithms)、加解密演算法(Encryption / Decryption algorithms)及 SSL / TLS 協議的實現等。加上其開放源碼的特性,使得許多開源專案或商業套件都有其踪跡。OpenSSL 除了提供程式 API 擴充接口外,也有命令列模式的操作。

本專案主要使用 C 程式語言撰寫,於 Windows / Linux / BSD / MacOS 下皆可運行。

本篇文章為 OpenSSL 系列文章第三篇。常見的加解密演算法分為對稱式與非對稱式,有興趣的使用者,可以在網路上搜尋相關的文章。本章節將介紹 OpenSSL 在非對稱式加解密演算法上的運用。本篇將著重於命令列模式下的非對稱式加解密演算法的操作。

使用 OpenSSL RSA 演算法產生私鑰

請使用 "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 的私鑰產生相對應的公鑰

請使用 "rsa" 為其參數,隨後附上 "-in" 參數指定私鑰檔案,"-out" 參數指定產生的公鑰檔案名稱,"-outform" 參數指定公鑰的輸出格式,以及 "-pubout" 參數結尾︰

$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
writing RSA key

執行後,OpenSSL 會產生 public.pem 的檔案在磁碟中。

使用 RSA 的公鑰加密檔案

請使用 "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:

若遇到此問題時,最簡單的方式就是使用對稱式的加解密演算法,而不是非對稱式的加解密演算法。

使用 RSA 的私鑰解密檔案

請使用 "rsautl" 為其參數,隨後附上 "-decrypt" 參數指定解密的運行,"-inkey" 參數指定密鑰檔案,"-in" 參數指定欲解密的檔案,以及 "-out" 參數指定解密後的檔案名稱:

$ openssl rsautl -decrypt -inkey private.pem -in file.rsa -out file

執行後,OpenSSL 會產生 file 的檔案在磁碟中。

結語

本篇範例介紹了 RSA 非對稱式加解密檔案的操作。當然除了本系列文章的介紹外,OpenSSL 還提供許多好用的功能,就請使用者自行探索囉。



您也許有興趣閱讀以下文章:




自由軟體鑄造場電子報 : 第 192 期 開放源碼的安全演算法工具︰OpenSSL(3)- RSA 非對稱式加解密演算法
標籤: OpenSSL,   rsa,   Symmetric Encryption and Decryption Algorithms,   Hash algorithms,  
分類: 技術專欄