Chapter 2.
OpenSSL的安裝和配置學習筆記
2.1
在linux上面安裝OpenSSL
我還是做點No
paper事情比較在行,正好和老師的課程接軌一下。
以前嘗試過在Windows上面安裝過openSSL,這次正好在Linux上面實作一下。
希望各位園友門糾錯,征求意見中。
2.1.1
安裝OpenSSL的系統環境和編譯環境
測試環境:Linux MINT 16 Petra
1
2
3
4
5
6
<code>$ lsb_release</code><code>-</code><code>a</code><code>#檢視linux發行版本系統資訊</code>
<code>No LSB modules are available.</code>
<code>Distributor</code><code>ID</code><code>: LinuxMint</code>
<code>Description: Linux Mint</code><code>16</code>
<code>Petra</code>
<code>Release: </code><code>16</code>
<code>Codename: petra</code>
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4YzMwMTN2ITN0AjMyITOwgTMwIzLcVDM0EDMy8CXvZmbp9CXt92YuUGZvNWatFWbuU2Zh1Wavw1LcpDc0RHaiojIsJye.png)
安裝OpenSSL所需:ANSI C 編譯器(推薦GCC)、 Perl5(或5以上)、
make(幾乎每個linux發行版本都具有)
LinuxMint 16 自帶perl
5,不需要安裝,如果沒有的話,應該需要安裝perl
參考http://os.51cto.com/art/200912/172903.htm
以編譯的源碼的形式安裝
2.1.2
linux下openSSL的安裝
<code>/</code><code>桌面</code><code>/</code><code>openssl</code><code>-</code><code>1.0</code><code>.</code><code>1g</code>
<code>$ ls </code><code>#解壓openssl-1.0.1g.tar.gz之後得到以下檔案</code>
<code>ACKNOWLEDGMENTS CHANGES.SSLeay doc include INSTALL.NW INSTALL.WCE Makefile.org NEWS PROBLEMS ssl VMS</code>
<code>apps config engines INSTALL INSTALL.OS2 LICENSE Makefile.shared openssl.doxy README test</code>
<code>bugs Configure e_os2.h install.com INSTALL.VMS MacOS makevms.com openssl.spec README.ASN1 times</code>
<code>certs crypto e_os.h INSTALL.DJGPP INSTALL.W32 Makefile ms os2 README.ENGINE tools</code>
<code>CHANGES demos FAQ INSTALL.MacOS INSTALL.W64 Makefile.bak Netware perl shlib util</code>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>~</code><code>/</code><code>桌面</code><code>/</code><code>openssl</code><code>-</code><code>1.0</code><code>.</code><code>1g</code>
<code>$ .</code><code>/</code><code>config</code><code>-</code><code>-</code><code>prefix</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>local</code><code>/</code><code>openssl </code><code>#OpenSSL配置檔案,配置安裝目錄</code>
<code>Operating system: x86_64</code><code>-</code><code>whatever</code><code>-</code><code>linux2</code>
<code>Configuring</code><code>for</code>
<code>linux</code><code>-</code><code>x86_64</code>
<code> </code><code>no</code><code>-</code><code>ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>gmp [default] OPENSSL_NO_GMP (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>jpake [experimental] OPENSSL_NO_JPAKE (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>krb5 [krb5</code><code>-</code><code>flavor</code><code>not</code>
<code>specified] OPENSSL_NO_KRB5</code>
<code> </code><code>no</code><code>-</code><code>md2 [default] OPENSSL_NO_MD2 (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>rc5 [default] OPENSSL_NO_RC5 (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>rfc3779 [default] OPENSSL_NO_RFC3779 (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>sctp [default] OPENSSL_NO_SCTP (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>shared [default]</code>
<code> </code><code>no</code><code>-</code><code>store [experimental] OPENSSL_NO_STORE (skip</code><code>dir</code><code>)</code>
<code> </code><code>no</code><code>-</code><code>zlib [default]</code>
<code> </code><code>no</code><code>-</code><code>zlib</code><code>-</code><code>dynamic [default]</code>
<code>IsMK1MF</code><code>=</code><code>0</code>
<code>CC </code><code>=</code><code>gcc</code>
<code>CFLAG </code><code>=</code><code>-</code><code>DOPENSSL_THREADS</code><code>-</code><code>D_REENTRANT</code><code>-</code><code>DDSO_DLFCN</code><code>-</code><code>DHAVE_DLFCN_H</code><code>-</code><code>Wa,</code><code>-</code><code>-</code><code>noexecstack</code><code>-</code><code>m64</code><code>-</code><code>DL_ENDIAN</code><code>-</code><code>DTERMIO</code><code>-</code><code>O3</code><code>-</code><code>Wall</code><code>-</code><code>DOPENSSL_IA32_SSE2</code><code>-</code><code>DOPENSSL_BN_ASM_MONT</code><code>-</code><code>DOPENSSL_BN_ASM_MONT5</code><code>-</code><code>DOPENSSL_BN_ASM_GF2m</code><code>-</code><code>DSHA1_ASM</code><code>-</code><code>DSHA256_ASM</code><code>-</code><code>DSHA512_ASM</code><code>-</code><code>DMD5_ASM</code><code>-</code><code>DAES_ASM</code><code>-</code><code>DVPAES_ASM</code><code>-</code><code>DBSAES_ASM</code><code>-</code><code>DWHIRLPOOL_ASM</code><code>-</code><code>DGHASH_ASM</code>
<code>EX_LIBS </code><code>=</code><code>-</code><code>ldl</code>
<code>CPUID_OBJ </code><code>=</code><code>x86_64cpuid.o</code>
<code>BN_ASM </code><code>=</code><code>x86_64</code><code>-</code><code>gcc.o x86_64</code><code>-</code><code>mont.o x86_64</code><code>-</code><code>mont5.o x86_64</code><code>-</code><code>gf2m.o modexp512</code><code>-</code><code>x86_64.o</code>
<code>DES_ENC </code><code>=</code><code>des_enc.o fcrypt_b.o</code>
<code>AES_ENC </code><code>=</code><code>aes</code><code>-</code><code>x86_64.o vpaes</code><code>-</code><code>x86_64.o bsaes</code><code>-</code><code>x86_64.o aesni</code><code>-</code><code>x86_64.o aesni</code><code>-</code><code>sha1</code><code>-</code><code>x86_64.o</code>
<code>......<br><br></code>
~/桌面/openssl-1.0.1g $ ./config -t
Operating system:
x86_64-whatever-linux2
Configuring for linux-x86_64
/usr/bin/perl
./Configure linux-x86_64 -Wa,--noexecstack
<code>$ make</code>
<code>#輸出一大堆資訊,有可能提示沒有gcc編譯器(需安裝),或者提示權限不足(用sudo指令)</code>
<code> </code><code>~</code><code>/</code><code>桌面</code><code>/</code><code>openssl</code><code>-</code><code>1.0</code><code>.</code><code>1g</code>
<code>$ make install</code>
<code>#輸出一大堆資訊,有可能提示提示權限不足(用sudo指令)</code>
驗證是否成功安裝OpenSSL。
<code>/</code><code>usr</code><code>/</code><code>local $ ldd</code><code>/</code><code>usr</code><code>/</code><code>local</code><code>/</code><code>openssl</code><code>/</code><code>bin</code><code>/</code><code>openssl </code><code>#添加環境變量</code>
<code>linux</code><code>-</code><code>vdso.so.</code><code>1</code>
<code>=</code><code>> (</code><code>0x00007fff0a3fe000</code><code>)</code>
<code>libdl.so.</code><code>2</code>
<code>=</code><code>></code><code>/</code><code>lib</code><code>/</code><code>x86_64</code><code>-</code><code>linux</code><code>-</code><code>gnu</code><code>/</code><code>libdl.so.</code><code>2</code>
<code>(</code><code>0x00007f620cdd6000</code><code>)</code>
<code>libc.so.</code><code>6</code>
<code>=</code><code>></code><code>/</code><code>lib</code><code>/</code><code>x86_64</code><code>-</code><code>linux</code><code>-</code><code>gnu</code><code>/</code><code>libc.so.</code><code>6</code>
<code>(</code><code>0x00007f620ca0e000</code><code>)</code>
<code>/</code><code>lib64</code><code>/</code><code>ld</code><code>-</code><code>linux</code><code>-</code><code>x86</code><code>-</code><code>64.so</code><code>.</code><code>2</code>
<code>(</code><code>0x00007f620cff3000</code><code>)</code>
<code>/</code><code>usr</code><code>/</code><code>local $ openssl version </code><code>#檢視OpenSSL版本資訊,并驗證是否安裝成功</code>
<code>OpenSSL</code><code>1.0</code><code>.</code><code>1e</code>
<code>11</code> <code>Feb</code><code>2013</code>
2.1.3
利用openssl的rsa算法進行加密解密
至此我們的OpenSSL在LinuxMINT上面安裝成功了,接下來我們進行簡單的rsa算法使用進行加密。
2.1.3.1
rsa算法簡要介紹:
RSA算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi
Shamir)和倫納德·阿德曼(Leonard
Adleman)一起提出的公鑰非對稱加密算法,是目前最有影響力的公鑰加密算法。
RSA算法基于一個十分簡單的數論事實:将兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,是以可以将乘積公開作為加密密鑰。
RSA的算法涉及三個參數,n、e1、e2。
其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密鑰對。其中(n,e1)為公鑰,(n,e2)為私鑰。[1]
RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e2
mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)
e1和e2可以互換使用,即:
A=B^e1 mod
n;B=A^e2 mod n;
2.1.3.2 使用OpenSSL進行RSA的加密及解密
26
27
28
29
30
31
32
33
34
<code>#生成密鑰檔案格式:openssl genrsa -out 密鑰檔案 密鑰長度</code>
<code>~</code><code>/</code><code>桌面 $ openssl genrsa</code><code>-</code><code>out test.key</code><code>1024</code>
<code>Generating RSA private key,</code><code>1024</code>
<code>bit</code><code>long</code>
<code>modulus</code>
<code>........................................</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code>
<code>..................</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code>
<code>e</code><code>is</code>
<code>65537</code> <code>(</code><code>0x10001</code><code>)</code>
<code>~</code><code>/</code><code>桌面 $ cat test.key</code>
<code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>BEGIN RSA PRIVATE KEY</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code>
<code>MIICXwIBAAKBgQDt86MIs2GWuHhyAlMd9fRnBJorp</code><code>/</code><code>Buii6YjoldzMaPF5KIf5ub</code>
<code>YKHhnGyYWPVo74mnWKRPDCL0o</code><code>/</code><code>pRhthdlHHY</code><code>/</code><code>Vdg2YG8KbK9wXwf4I</code><code>+</code><code>zihsc4vRy</code>
<code>NgmJNbF1jGI4srRt8oqtBDtrsYZykLYcqtWWxL9bqjXdJO9PtipOssK7DwIDAQAB</code>
<code>AoGBANPyquqKFUfSIn6ysWRDeyHzyHtQSGm9rYl3lMW3K7mzLnNk7q60oRy7X0NI</code>
<code>IbgJfRxRaXF7hvtPwBy0Nq8MFWaReEcnxcPJt61TKTwvFrKlGeZnrG71ksgazZel</code>
<code>690FrN67R1rUfPO1HCJA58InBGstktSVo</code><code>+</code><code>BXhXCfcoae7jIJAkEA</code><code>+</code><code>IAd6KZUU</code><code>+</code><code>71</code>
<code>KgdXMVUHCEUG</code><code>+</code><code>MQ4tISCuVV5Xq2in46tVWN5xeyneJirIpOrNk0rldS6MOKPoDav</code>
<code>Gg</code><code>/</code><code>bkgaf7QJBAPUiBY7BUG2FVs</code><code>/</code><code>nMbJg4qaTORVge84Sr2kK9A3wfvcul3bzgQ8u</code>
<code>xhubxQx6wuOwJ3</code><code>+</code><code>ZjDT1chq7AO</code><code>+</code><code>6hbc7D2sCQQC</code><code>+</code><code>H19CqUcpdFCUWEtojfI0bIN5</code>
<code>/</code><code>r6Xti5B19hlDJm4U7Pf</code><code>+</code><code>ZyoRniW9s8wRCShBgfLuZa</code><code>+</code><code>Ygia</code><code>/</code><code>luXp</code><code>/</code><code>xIy9K9AkEA</code>
<code>wTGuFaNvwtFa6QH6He7T0pqnW5yuFmyNiIkUbcQEHMXApAQnzBJ</code><code>+</code><code>GhY7R6mc3Zvg</code>
<code>lWUrpjVnV3</code><code>/</code><code>Yrhdf</code><code>+</code><code>Vf3vwJBAMO796q9Ne9YJvqTQMo9AjmQgD3kw9txhJe0BlQV</code>
<code>YX</code><code>/</code><code>Ffwo2FxFDdCAwNKWyKt3zEyXOmnxxvdzQb0MY2WSV7CE</code><code>=</code>
<code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>END RSA PRIVATE KEY</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code>
<code>#密鑰檔案生成公鑰檔案</code>
<code>#格式:openssl rsa -in 密鑰檔案 -pubout -out 公鑰檔案</code>
<code>~</code><code>/</code><code>桌面 $ openssl rsa</code><code>-</code><code>in</code>
<code>test.key</code><code>-</code><code>pubout</code><code>-</code><code>out TPub.key</code>
<code>writing RSA key</code>
<code>~</code><code>/</code><code>桌面 $ cat TPub.key</code>
<code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>BEGIN PUBLIC KEY</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code>
<code>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDt86MIs2GWuHhyAlMd9fRnBJor</code>
<code>p</code><code>/</code><code>Buii6YjoldzMaPF5KIf5ubYKHhnGyYWPVo74mnWKRPDCL0o</code><code>/</code><code>pRhthdlHHY</code><code>/</code><code>Vdg</code>
<code>2YG8KbK9wXwf4I</code><code>+</code><code>zihsc4vRyNgmJNbF1jGI4srRt8oqtBDtrsYZykLYcqtWWxL9b</code>
<code>qjXdJO9PtipOssK7DwIDAQAB</code>
<code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>END PUBLIC KEY</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code>
這裡我們生成一個包含"this text will
encrypt"的文本檔案TText.en作為待加密檔案,并使用rsa加密算法對其進行加密,然後在對加密檔案進行解密。
這裡需要注意的是用OpenSSL的rsa算法生成的秘鑰檔案就是本次解密使用的私鑰,而我們的公鑰是由該私鑰檔案分解出來的(openssl rsa -in
密鑰檔案 -pubout -out 公鑰檔案),即私鑰内包含公鑰。