直接上密碼學(xué)入門級知識部分,今天的內(nèi)容如下:
1、密碼學(xué)概述
2、離散對數(shù)問題
3、歐拉函數(shù)、歐拉定理、費馬小定理
4、模反元素&公式推導(dǎo)
5、迪菲赫爾曼密鑰交換
6、終端演示:RSA加密
7、證書生成
8、base64編碼
一、密碼學(xué)概述與發(fā)展歷史
1、密碼學(xué)的概述
密碼學(xué)是指研究信息加密,破解密碼的一門技術(shù)科學(xué)。
2、密碼學(xué)的主要發(fā)展歷史:
密碼學(xué)的起源可追溯至2000年前,而當今的密碼學(xué)是以數(shù)學(xué)為基礎(chǔ)的。
密碼學(xué)的起源:相傳古羅馬名將凱撒大帝為了防止別人截獲情報,用密碼傳送情報。凱撒的做法很簡單,就是對二十幾個羅馬字母建立一張對應(yīng)表。這樣,如果不知道密碼本,即使截獲一段信息也看不懂。密碼學(xué)也正是在編碼與破譯的斗爭實踐中逐步發(fā)展起來的。
·從凱撒大帝時代到上世紀70年代這段很長的時間里,密碼學(xué)發(fā)展的十分緩慢,因為設(shè)計者基本上靠經(jīng)驗,沒有運用數(shù)學(xué)原理。
·在1976以前,所有的加密方法都是同一種模式:加密和解密使用同一種算法。在交互數(shù)據(jù)的時候,彼此通信的雙方就必須把規(guī)則告訴對方,否則無法解密。那么加密和解密的規(guī)則(簡稱 密鑰【mì yuè】),它的保護就顯得尤其重要。傳遞密鑰成了最大的隱患。這種加密方式稱為對稱加密算法
·1976年,兩位美國計算機學(xué)家迪菲(Bailey Whitfield Diffie)、赫爾曼(Martin Edward Hellman)提出了一種嶄新構(gòu)思,可以在不傳遞密鑰的情況下,完成密鑰交換。這被稱為“迪菲-赫爾曼密鑰交換(英語:Diffie–Hellman key exchange,縮寫為D-H)”算法,開啟了密碼學(xué)研究的新方向。
·1977年三位麻省理工學(xué)院的數(shù)學(xué)家羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起設(shè)計了一種算法,可以實現(xiàn)非對稱加密。這個算法用他們?nèi)齻€人的姓氏首字母命名,叫做RSA算法。
二、離散對數(shù)問題
先看下面一個取模運算的例子(取模運算叫做時鐘運算,我們也常稱為取余數(shù)運算,運算符為'mod',簡寫為'%')
如果取一個質(zhì)數(shù)n做模數(shù),比如n=17,再找一個小于n的質(zhì)數(shù)m,比如m=3,則有一個數(shù)學(xué)的規(guī)律:如果3的k次方,滿足當k是小于17的正整數(shù)的時候,比如k在1~16中間取,滿足 m ^ k % n 的結(jié)果在1~(n-1)中間隨機的時候(這個隨機是分別對應(yīng),不會重復(fù)!),m就稱為n的原根。
3為17的原根
3 ^ 1 % 17 = 3;
3 ^ 2 % 17 = 9;
3 ^ 3 % 17 = 10;
3 ^ 4 % 17 = 13;
3 ^ 5 % 17 = 5;
3 ^ 6 % 17 = 15;
3 ^ 7 % 17 = 11;
3 ^ 8 % 17 = 16;
3 ^ 9 % 17 = 14;
3 ^ 10 % 17 = 8;
3 ^ 11 % 17 = 7;
3 ^ 12 % 17 = 4;
3 ^ 13 % 17 = 12;
3 ^ 14 % 17 = 2;
3 ^ 15 % 17 = 6;
3 ^ 16 % 17 = 1;
...
m ^ k % n = r;(上面m=3,k遞增,n為17,結(jié)果r就在1~(17 -1)范圍內(nèi)取值)
根據(jù)上面的例子思考:比如讓你完成填空 3 ^ k mod 17 = 12;(m為正整數(shù)),那么m的值可以取13;
因為3的13次方模17等于12,k可以取值為13,但是k還可以取其他的值,使3的k次方模17等于12,這個等式從左邊推理:3 ^ 13 mod 17 等于12,但是這個等式反過來推k的值,就是不確定的一個值,k=13只是其中的一個值,密碼學(xué)中要通過這個等式來推出確定的k的值(比如逆推出k=13),就會非常的難,并且難度會隨著取模的質(zhì)數(shù)(例子中17這個數(shù))的增大而增加,這個問題就是離散對數(shù)問題。如果取模的質(zhì)數(shù)k(例子中是17這個數(shù))非常大,長達幾百位,那么就算你知道整個表達式的結(jié)果和算法,在比較有限的時間內(nèi),想要反推k的值,基本是不可能的。
三、歐拉函數(shù)及歐拉定理
1、歐拉函數(shù)
質(zhì)數(shù)的概念:只能被1和自己整除的正整數(shù),比如2,3,5,7,11...
互質(zhì)關(guān)系:如果兩個正整數(shù),除了1之外,沒有其他公因數(shù),我們就稱這兩個數(shù)是互質(zhì)關(guān)系。
那么問題來了,思考一下:
給定任意正整數(shù)n,請問在小于等于n的正整數(shù)之中,有多少個與n能構(gòu)成互質(zhì)關(guān)系?
如:
計算8的歐拉函數(shù),小于等于8的數(shù)1、2、3、4、5、6、7、8中和8互質(zhì)的有1,3,5,7
所以:φ(8) = 4;
計算7的歐拉函數(shù),小于等于7的數(shù)1、2、3、4、5、6、7中和7互質(zhì)的有1,2,3,4,5,6
所以:φ(7) = 6;
計算6的歐拉函數(shù),小于等于6的數(shù)1、2、3、4、5、6中和6互質(zhì)的有1、5
所以:φ(6) = 2;
計算5的歐拉函數(shù),小于等于5的數(shù)1、2、3、4、5中和5互質(zhì)的有1,2,3,4
所以:φ(5) = 4;
計算56的歐拉函數(shù)
φ(56)= φ(8) * φ(7) = 4 * 6 = 24;
計算這個值的方式叫做歐拉函數(shù),使用:φ(n)表示
歐拉函數(shù)特點:
一、當n是質(zhì)數(shù)的時候,φ(n) = n - 1;
二、如果n可以分解成兩個互質(zhì)的整數(shù)之積,如n = A * B;(A和B互質(zhì)),則:
φ(A * B) = φ(A) * φ(B);
根據(jù)以上兩點能得到:
如果N是兩個質(zhì)數(shù)P1和P2的乘積,則:
φ(N) = φ(P1) * φ(P2) = (P1 - 1) * (P2 - 1);
所以上面φ(56)= φ(8) * φ(7) = 4 * 6 = 24;
2、歐拉定理
如果兩個正整數(shù)m和n互質(zhì),那么m的φ(n)次方減去1,可以被n整除。
歐拉定理公式:
3、費馬小定理
費馬小定理屬于歐拉定理的特殊情況:
如果兩個正整數(shù) m 和 n 互質(zhì),并且 n 為質(zhì)數(shù)!那么φ(n)的結(jié)果就是 n - 1 ;
費馬小定理公式:
四、模反元素&公式推導(dǎo)
1、模反元素
如果兩個正整數(shù) e 和 x 互質(zhì),那么一定可以找到整數(shù) d , 使得ed - 1 被 x 整除,那么 d 就是 e 對于 x 的 “模反元素”
模反元素公式:
2、公式推導(dǎo)
根據(jù)上面模反元素的性質(zhì),e 是和 x 互質(zhì);
如果x == φ(n), 也就是 e 和 φ(n)互質(zhì);
套入模反元素的公式推理就能得出最后的公式:
到這里我提醒一下:m 經(jīng)過一系列變換仍然能夠還原成 m ,只需要滿足兩個條件,這兩個條件是公式轉(zhuǎn)化的必要條件
1、m 和 n 互質(zhì)
2、e 和 φ(n)互質(zhì)
推理的過程中 d 是 e 對于 x 的模反元素,x = φ(n)的時候滿足公式轉(zhuǎn)化, 所以 d 也是 e 對于 φ(n) 的模反元素;但是由于 d 是 模反元素,所以上述兩個條件中的第一個條件,m 和 n 即使沒有互質(zhì)關(guān)系,該等式一樣可以成立,但是需要需要滿足另外一個條件 m < n;具體驗證可自行驗證一下(數(shù)學(xué)家驗證過的定理)
所以得到了最終的公式及滿足公式的條件
公式:
條件:
1、 m 小于 n
2、 e 和 φ(n) 互質(zhì)
五、迪菲赫爾曼秘鑰交換
1、密鑰交換原理圖及流程示意圖(實質(zhì)上就是拆分了歐拉定理)
2、RSA算法
m ^ e mod n = c 加密
c ^ d mod n = m 解密
公鑰:n 和 e ,主要是 e
私鑰:n 和 d ,主要是 d
明文:m
密文:c
3、RSA算法說明
1、n會非常大,長度一般為1024個二進制位。(目前人類已經(jīng)分解的最大整數(shù),232個十進制位,768個二進制位)
2、由于需要計算出φ(n),所以根據(jù)歐拉函數(shù)的特點,最簡單的方式n由兩個質(zhì)數(shù)相乘得到,質(zhì)數(shù)p1,p2
φ(n) = (p1 - 1) * (p2 - 1);
3、最終由φ(n)得到 e 和 d。
總共生成6個數(shù)字:p1、p2、n、φ(n)、 e 、 d
4、RSA安全問題
除了公鑰用到了 n 和 e,其余的四個數(shù)字是不公開的。
目前破解RSA得到d的方式如下:
1、要想求出私鑰d。由于e * d = φ(n) * k + 1 ; 必須要知道e 和 φ(n);
2、e 是知道的,但是要得到 φ(n),必須知道 p1和p2;
3、由于n = p1 * p2; 只有把 n 因式分解才能算出來; 但是因為 n 非常大,分解成兩個質(zhì)數(shù)的難度不言而喻,和暴力破解差不多,只能不斷的去嘗試。
5、RSA延伸應(yīng)用思考
由于RSA原理算法推導(dǎo),最開始就有一個條件,就是 m < n, 盡管n會取非常大,但是理論上仍然會限制RSA加密的使用,所以RSA加密不適用于加密非常非常大的數(shù)據(jù),效率比較低,一般結(jié)合其他加密方式來加密關(guān)鍵部分的數(shù)據(jù)。比如加密key,數(shù)字簽名
六、終端演示:RSA加密
一、終端加密指令OpenSSL使用RSA:
由于Mac系統(tǒng)內(nèi)置OpenSSL(開源加密庫),所以我們直接在終端上使用命令來玩RSA,OpenSSL公開庫中RSA算法常用命令主要有三個:
命令1:genrsa -> 生成并輸入一個RSA私鑰
命令2:rsautl -> 使用RSA密鑰進行加密、解密、簽名和驗證等運算
命令3:處理RSA密鑰的格式轉(zhuǎn)換等問題
1、生成RSA私鑰,密鑰長度為1024bit,私鑰文件名為private.pem
openssl genrsa -out private.pem 1024
2、從私鑰中提取公鑰
openssl rsa -in private.pem -pubout -out public.pem
3、將私鑰private.pem轉(zhuǎn)化成為明文private.txt文件
openssl rsa -in private.pem -text -out private.txt
4、通過公鑰文件public.pem加密明文文件message.txt,生成enc.txt
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
5、通過私鑰文件private.pem解密公鑰加過密的文件enc.txt并生成解密之后的文件dec.txt
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
二、終端加密實踐實例
實例我在里面加入了各步驟的注釋含義
步驟1. cd到一個文件夾下
battleMage:~ battleMage$ cd /Users/fightmaster/Desktop/RSA密碼學(xué)MacDown
步驟2. 生成私鑰并輸出一個叫private.pem的私鑰文件
battleMage:RSA密碼學(xué)MacDown battleMage$ openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
.++++++
..................++++++
e is 65537 (0x10001)
步驟3. 根據(jù)私鑰提取一個公鑰,并輸出一個叫public.pem的公鑰文件
battleMage:RSA密碼學(xué)MacDown battleMage$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key
步驟4. 輸出查看私鑰文件
battleMage:RSA密碼學(xué)MacDown battleMage$ cat private.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDNjQhpiI36VDchXNvdTREfqoyEw2gG+Z8XHyz+4QJ0Bh7WCo2B
q8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6y72LMRKa6emMAuBnvX6k2AsN
7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y855m5953oLAPgdmsEwIDAQAB
AoGAVbfUpD3gB16LRwx0W8tBstTqmIrsnMwIPhowJ3IqFbxfq57m+AZuUFzG9deO
4JTg/qg6yyXlptuqFPwscueJMhC6d5cPddmz6wADuu3FS03C7dnyiDOeaQ8ejIzI
yVPWaQChtHWp0kSTCGwAW4WgB7BOvR4SH1SLVMnH6OoYjmECQQDy2aYrYuJFy+qM
VVsueWijT29IO/evRvv0ap9KRcPRkXZi8/yN7W+eakMgM0Nm0pzc4Rdd05c53lc8
VNi30fg5AkEA2K5Y1irEaN74kSWOxEBk98SUN2ZOZxVCp/jEePPTb5aQv49dEvP1
VEktDD8wgHpUdOC3iT9hN8Oabv2cy7POqwJBAOo3XdtEUGTuiXT1Ma6961xuVS5+
n6BNvtx5JM32QSjSuTIwjKi5kchgRgM9TclSYXVqJiYY1yY5uTr3vdhzyokCQFWY
Ye2QjXAkDKtB2+j4yyn5VNehqX0dL+ys3+gr4a1mHB4gIxNWneZC1fHNkHpgWLan
ArnL+LqPoZUQyHzLtesCQGtwhl/NOGeW0vrvqg99Qpb6Pi2hV5oS2bHfImBkJeOx
cTTcyaGL0oTMB5tfh1VnwmgIk6DRjZcIp4prHV3JBQ0=
-----END RSA PRIVATE KEY-----
步驟5. 輸出查看公鑰文件
battleMage:RSA密碼學(xué)MacDown battleMage$ cat public.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNjQhpiI36VDchXNvdTREfqoyE
w2gG+Z8XHyz+4QJ0Bh7WCo2Bq8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6
y72LMRKa6emMAuBnvX6k2AsN7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y
855m5953oLAPgdmsEwIDAQAB
-----END PUBLIC KEY-----
步驟6.生成并輸出文件名為private.txt的私鑰txt文件
battleMage:RSA密碼學(xué)MacDown battleMage$ openssl rsa -in private.pem -text -out private.txt
writing RSA key
步驟7.查看私鑰private.txt文件中的內(nèi)容
battleMage:RSA密碼學(xué)MacDown battleMage$ cat private.txt
Private-Key: (1024 bit)
modulus:
00:cd:8d:08:69:88:8d:fa:54:37:21:5c:db:dd:4d:
11:1f:aa:8c:84:c3:68:06:f9:9f:17:1f:2c:fe:e1:
02:74:06:1e:d6:0a:8d:81:ab:cb:3b:d8:ba:2a:5c:
c7:07:ff:43:f1:9f:ae:f3:6f:9b:1b:15:3c:02:d4:
cb:4a:ea:c6:7d:6b:81:7a:cb:bd:8b:31:12:9a:e9:
e9:8c:02:e0:67:bd:7e:a4:d8:0b:0d:ec:9b:a5:91:
89:9f:67:c7:33:be:d2:4f:1a:12:18:38:df:38:75:
61:f9:2f:5b:af:bd:5e:a3:cd:1f:d8:f3:9e:66:e7:
de:77:a0:b0:0f:81:d9:ac:13
publicExponent: 65537 (0x10001)
privateExponent:
55:b7:d4:a4:3d:e0:07:5e:8b:47:0c:74:5b:cb:41:
b2:d4:ea:98:8a:ec:9c:cc:08:3e:1a:30:27:72:2a:
15:bc:5f:ab:9e:e6:f8:06:6e:50:5c:c6:f5:d7:8e:
e0:94:e0:fe:a8:3a:cb:25:e5:a6:db:aa:14:fc:2c:
72:e7:89:32:10:ba:77:97:0f:75:d9:b3:eb:00:03:
ba:ed:c5:4b:4d:c2:ed:d9:f2:88:33:9e:69:0f:1e:
8c:8c:c8:c9:53:d6:69:00:a1:b4:75:a9:d2:44:93:
08:6c:00:5b:85:a0:07:b0:4e:bd:1e:12:1f:54:8b:
54:c9:c7:e8:ea:18:8e:61
prime1:
00:f2:d9:a6:2b:62:e2:45:cb:ea:8c:55:5b:2e:79:
68:a3:4f:6f:48:3b:f7:af:46:fb:f4:6a:9f:4a:45:
c3:d1:91:76:62:f3:fc:8d:ed:6f:9e:6a:43:20:33:
43:66:d2:9c:dc:e1:17:5d:d3:97:39:de:57:3c:54:
d8:b7:d1:f8:39
prime2:
00:d8:ae:58:d6:2a:c4:68:de:f8:91:25:8e:c4:40:
64:f7:c4:94:37:66:4e:67:15:42:a7:f8:c4:78:f3:
d3:6f:96:90:bf:8f:5d:12:f3:f5:54:49:2d:0c:3f:
30:80:7a:54:74:e0:b7:89:3f:61:37:c3:9a:6e:fd:
9c:cb:b3:ce:ab
exponent1:
00:ea:37:5d:db:44:50:64:ee:89:74:f5:31:ae:bd:
eb:5c:6e:55:2e:7e:9f:a0:4d:be:dc:79:24:cd:f6:
41:28:d2:b9:32:30:8c:a8:b9:91:c8:60:46:03:3d:
4d:c9:52:61:75:6a:26:26:18:d7:26:39:b9:3a:f7:
bd:d8:73:ca:89
exponent2:
55:98:61:ed:90:8d:70:24:0c:ab:41:db:e8:f8:cb:
29:f9:54:d7:a1:a9:7d:1d:2f:ec:ac:df:e8:2b:e1:
ad:66:1c:1e:20:23:13:56:9d:e6:42:d5:f1:cd:90:
7a:60:58:b6:a7:02:b9:cb:f8:ba:8f:a1:95:10:c8:
7c:cb:b5:eb
coefficient:
6b:70:86:5f:cd:38:67:96:d2:fa:ef:aa:0f:7d:42:
96:fa:3e:2d:a1:57:9a:12:d9:b1:df:22:60:64:25:
e3:b1:71:34:dc:c9:a1:8b:d2:84:cc:07:9b:5f:87:
55:67:c2:68:08:93:a0:d1:8d:97:08:a7:8a:6b:1d:
5d:c9:05:0d
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDNjQhpiI36VDchXNvdTREfqoyEw2gG+Z8XHyz+4QJ0Bh7WCo2B
q8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6y72LMRKa6emMAuBnvX6k2AsN
7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y855m5953oLAPgdmsEwIDAQAB
AoGAVbfUpD3gB16LRwx0W8tBstTqmIrsnMwIPhowJ3IqFbxfq57m+AZuUFzG9deO
4JTg/qg6yyXlptuqFPwscueJMhC6d5cPddmz6wADuu3FS03C7dnyiDOeaQ8ejIzI
yVPWaQChtHWp0kSTCGwAW4WgB7BOvR4SH1SLVMnH6OoYjmECQQDy2aYrYuJFy+qM
VVsueWijT29IO/evRvv0ap9KRcPRkXZi8/yN7W+eakMgM0Nm0pzc4Rdd05c53lc8
VNi30fg5AkEA2K5Y1irEaN74kSWOxEBk98SUN2ZOZxVCp/jEePPTb5aQv49dEvP1
VEktDD8wgHpUdOC3iT9hN8Oabv2cy7POqwJBAOo3XdtEUGTuiXT1Ma6961xuVS5+
n6BNvtx5JM32QSjSuTIwjKi5kchgRgM9TclSYXVqJiYY1yY5uTr3vdhzyokCQFWY
Ye2QjXAkDKtB2+j4yyn5VNehqX0dL+ys3+gr4a1mHB4gIxNWneZC1fHNkHpgWLan
ArnL+LqPoZUQyHzLtesCQGtwhl/NOGeW0vrvqg99Qpb6Pi2hV5oS2bHfImBkJeOx
cTTcyaGL0oTMB5tfh1VnwmgIk6DRjZcIp4prHV3JBQ0=
-----END RSA PRIVATE KEY-----
步驟8. 生成一個示例message.txt的需要加密的內(nèi)容文件,編輯message.txt文件,隨意填寫一個示例文本,比如"密碼123456"
battleMage:RSA密碼學(xué)MacDown battleMage$ vi message.txt
步驟9. 將message.txt文件通過公鑰public.pem文件加密生成并輸出enc.txt文件
battleMage:RSA密碼學(xué)MacDown battleMage$ openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
步驟10. 輸出enc.txt加密后的文件(看起來是亂碼)
battleMage:RSA密碼學(xué)MacDown battleMage$ cat enc.txt
n?9M?^?>???N?h??!?8{?]??????
??R?'??3?D?6i??^
?k6'?
F?>2?s>??Xx1?&\??x?
???? ?!m?2+'?x
步驟11、通過私鑰private.pem文件解密enc.txt文件,并輸出解密后的dec.txt文件
battleMage:RSA密碼學(xué)MacDown battleMage$ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
battleMage:RSA密碼學(xué)MacDown battleMage$
上述步驟分別得到的結(jié)果是:
步驟2:得到的私鑰文件private.pem
步驟3:從私鑰中提取出來的公鑰文件public.pem
步驟6:輸出查看的私鑰txt文件 private.txt
步驟8:生成一個需要加密的message.txt文件,編輯內(nèi)容為"密碼123456"
步驟9:message.txt通過公鑰文件public.pem加密并輸出對應(yīng)的加密文件enc.txt
步驟11:通過私鑰private.pem解密之前加密的密文enc.txt,并生成解密后的文件dec.txt
七、證書生成
如果我們想要使用RSA算法,那么我們需要對應(yīng)的證書文件,但是在項目開發(fā)中,蘋果是不允許我們直接使用pem證書的,我們要生成對應(yīng)的crt文件
需要多次填寫證書的信息,比如下面的國家,省,市,組織信息,郵箱Email,還有證書額外的密碼
/Users/fightmaster/Desktop/RSA密碼學(xué)MacDown/終端操作演示文件
步驟1:根據(jù)私鑰private.pem生成一個RSA證書請求文件
battleMage:終端操作演示文件 battleMage$ openssl req -new -key private.pem -out rsacert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:CN
State or Province Name (full name) []:hubei
Locality Name (eg, city) []:WuHan
Organization Name (eg, company) []:BattleMage
Organizational Unit Name (eg, section) []:battleMage.com
Common Name (eg, fully qualified host name) []:battleMage.com
Email Address []:1273937502@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
步驟2:根據(jù).csr請求文件,申請.crt證書文件
battleMage:終端操作演示文件 battleMage$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
Signature ok
subject=/C=CN/ST=hubei/L=WuHan/O=BattleMage/OU=battleMage.com/CN=battleMage.com/emailAddress=1273937502@qq.com
Getting Private key
步驟3:生成p.p12文件,及設(shè)置p.p12文件打開的密碼(密碼可以不設(shè)置)
battleMage:終端操作演示文件 battleMage$ openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
Enter Export Password:
Verifying - Enter Export Password:
battleMage:終端操作演示文件 battleMage$
終端演示生成文件如下
八、base64編碼
base64只是一種編碼方案,根據(jù)base64對照表將任意的二進制進行編碼;base64主要是為了查看二進制,只是二進制的一種表現(xiàn)形式
base64 總共 65種字符,0 ~ 9,a ~ z,A ~ Z 還有'+','/'和'=',將二進制以每6個為一組進行編碼;
base64編碼表中只有64個字符,編碼表中不包含'=','='是隱含的第65個字符,'='是用來補足最后拆成6位不足的
比如原二進制
0101 1000 0101 0101 0001
經(jīng)過base64以6位為分割,變成
010110 000101 010100 01
不足6位后都補0,變成
010110 000101 010100 010000
因為存儲的時候,內(nèi)存需要對齊,所以可能最后幾個補齊的位置為
010110 000101 010100 010000 000000 000000
后面的這種形式的'000000'就會被替換為'=';所以base64編碼一般都很明顯,最后幾位一般都是'=';
下面是base64位編碼表:
iOS中OC使用base64的代碼示例如下
1、base64編碼
- (NSString *)customBase64Encode:(NSString *)encodeText {
NSData * data = [encodeText dataUsingEncoding:NSUTF8StringEncoding];
NSString * tempStr = [data base64EncodedStringWithOptions:0];
return tempStr;
}
2、base64解碼
- (NSString *)customBase64Decode:(NSString *)decodeText {
NSData * data = [[NSData alloc] initWithBase64EncodedString:decodeText options:(0)];
NSString * tempStr = [data base64EncodedStringWithOptions:0];
return tempStr;
}
今天就到這里,看完有收獲,點個贊謝謝啦~