iOS逆向攻防之密碼學(xué)基礎(chǔ)及RSA數(shù)學(xué)原理、Base64編碼

直接上密碼學(xué)入門(mén)級(jí)知識(shí)部分,今天的內(nèi)容如下:

1、密碼學(xué)概述
2、離散對(duì)數(shù)問(wèn)題
3、歐拉函數(shù)、歐拉定理、費(fèi)馬小定理
4、模反元素&公式推導(dǎo)
5、迪菲赫爾曼密鑰交換
6、終端演示:RSA加密
7、證書(shū)生成
8、base64編碼

一、密碼學(xué)概述與發(fā)展歷史


1、密碼學(xué)的概述

密碼學(xué)是指研究信息加密,破解密碼的一門(mén)技術(shù)科學(xué)。

2、密碼學(xué)的主要發(fā)展歷史:

密碼學(xué)的起源可追溯至2000年前,而當(dāng)今的密碼學(xué)是以數(shù)學(xué)為基礎(chǔ)的。

密碼學(xué)的起源:相傳古羅馬名將凱撒大帝為了防止別人截獲情報(bào),用密碼傳送情報(bào)。凱撒的做法很簡(jiǎn)單,就是對(duì)二十幾個(gè)羅馬字母建立一張對(duì)應(yīng)表。這樣,如果不知道密碼本,即使截獲一段信息也看不懂。密碼學(xué)也正是在編碼與破譯的斗爭(zhēng)實(shí)踐中逐步發(fā)展起來(lái)的。

·從凱撒大帝時(shí)代到上世紀(jì)70年代這段很長(zhǎng)的時(shí)間里,密碼學(xué)發(fā)展的十分緩慢,因?yàn)樵O(shè)計(jì)者基本上靠經(jīng)驗(yàn),沒(méi)有運(yùn)用數(shù)學(xué)原理。

·在1976以前,所有的加密方法都是同一種模式:加密和解密使用同一種算法。在交互數(shù)據(jù)的時(shí)候,彼此通信的雙方就必須把規(guī)則告訴對(duì)方,否則無(wú)法解密。那么加密和解密的規(guī)則(簡(jiǎn)稱(chēng) 密鑰【mì yuè】),它的保護(hù)就顯得尤其重要。傳遞密鑰成了最大的隱患。這種加密方式稱(chēng)為對(duì)稱(chēng)加密算法

·1976年,兩位美國(guó)計(jì)算機(jī)學(xué)家迪菲(Bailey Whitfield Diffie)、赫爾曼(Martin Edward Hellman)提出了一種嶄新構(gòu)思,可以在不傳遞密鑰的情況下,完成密鑰交換。這被稱(chēng)為“迪菲-赫爾曼密鑰交換(英語(yǔ):Diffie–Hellman key exchange,縮寫(xiě)為D-H)”算法,開(kāi)啟了密碼學(xué)研究的新方向。

·1977年三位麻省理工學(xué)院的數(shù)學(xué)家羅納德·李維斯特Ron Rivest)、阿迪·薩莫爾Adi Shamir)和倫納德·阿德曼Leonard Adleman)一起設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對(duì)稱(chēng)加密。這個(gè)算法用他們?nèi)齻€(gè)人的姓氏首字母命名,叫做RSA算法。

二、離散對(duì)數(shù)問(wèn)題


先看下面一個(gè)取模運(yùn)算的例子(取模運(yùn)算叫做時(shí)鐘運(yùn)算,我們也常稱(chēng)為取余數(shù)運(yùn)算,運(yùn)算符為'mod',簡(jiǎn)寫(xiě)為'%'

如果取一個(gè)質(zhì)數(shù)n做模數(shù),比如n=17,再找一個(gè)小于n的質(zhì)數(shù)m,比如m=3,則有一個(gè)數(shù)學(xué)的規(guī)律:如果3的k次方,滿(mǎn)足當(dāng)k是小于17的正整數(shù)的時(shí)候,比如k在1~16中間取,滿(mǎn)足 m ^ k % n 的結(jié)果在1~(n-1)中間隨機(jī)的時(shí)候(這個(gè)隨機(jī)是分別對(duì)應(yīng),不會(huì)重復(fù)!),m就稱(chēng)為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;

因?yàn)?的13次方模17等于12,k可以取值為13,但是k還可以取其他的值,使3的k次方模17等于12,這個(gè)等式從左邊推理:3 ^ 13 mod 17 等于12,但是這個(gè)等式反過(guò)來(lái)推k的值,就是不確定的一個(gè)值,k=13只是其中的一個(gè)值,密碼學(xué)中要通過(guò)這個(gè)等式來(lái)推出確定的k的值(比如逆推出k=13),就會(huì)非常的難,并且難度會(huì)隨著取模的質(zhì)數(shù)(例子中17這個(gè)數(shù))的增大而增加,這個(gè)問(wèn)題就是離散對(duì)數(shù)問(wèn)題。如果取模的質(zhì)數(shù)k(例子中是17這個(gè)數(shù))非常大,長(zhǎng)達(dá)幾百位,那么就算你知道整個(gè)表達(dá)式的結(jié)果和算法,在比較有限的時(shí)間內(nèi),想要反推k的值,基本是不可能的。

三、歐拉函數(shù)及歐拉定理


1、歐拉函數(shù)

質(zhì)數(shù)的概念:只能被1和自己整除的正整數(shù),比如2,3,5,7,11...
互質(zhì)關(guān)系:如果兩個(gè)正整數(shù),除了1之外,沒(méi)有其他公因數(shù),我們就稱(chēng)這兩個(gè)數(shù)是互質(zhì)關(guān)系。

那么問(wèn)題來(lái)了,思考一下:
給定任意正整數(shù)n,請(qǐng)問(wèn)在小于等于n的正整數(shù)之中,有多少個(gè)與n能構(gòu)成互質(zhì)關(guān)系?

如:

計(jì)算8的歐拉函數(shù),小于等于8的數(shù)1、2、3、4、5、6、7、8中和8互質(zhì)的有1,3,5,7
所以:φ(8) = 4;
計(jì)算7的歐拉函數(shù),小于等于7的數(shù)1、2、3、4、5、6、7中和7互質(zhì)的有1,2,3,4,5,6
所以:φ(7) = 6;
計(jì)算6的歐拉函數(shù),小于等于6的數(shù)1、2、3、4、5、6中和6互質(zhì)的有1、5
所以:φ(6) = 2;
計(jì)算5的歐拉函數(shù),小于等于5的數(shù)1、2、3、4、5中和5互質(zhì)的有1,2,3,4
所以:φ(5) = 4;

計(jì)算56的歐拉函數(shù)
φ(56)= φ(8) * φ(7) = 4 * 6 = 24;

計(jì)算這個(gè)值的方式叫做歐拉函數(shù),使用:φ(n)表示

歐拉函數(shù)特點(diǎn):
一、當(dāng)n是質(zhì)數(shù)的時(shí)候,φ(n) = n - 1;
二、如果n可以分解成兩個(gè)互質(zhì)的整數(shù)之積,如n = A * B;(A和B互質(zhì)),則: 
   φ(A * B) = φ(A) * φ(B);
   
根據(jù)以上兩點(diǎn)能得到:
如果N是兩個(gè)質(zhì)數(shù)P1和P2的乘積,則:
φ(N) = φ(P1) * φ(P2) = (P1 - 1) * (P2 - 1);

所以上面φ(56)= φ(8) * φ(7) = 4 * 6 = 24;

2、歐拉定理

如果兩個(gè)正整數(shù)m和n互質(zhì),那么m的φ(n)次方減去1,可以被n整除。

歐拉定理公式:

歐拉定理公式.png

3、費(fèi)馬小定理

費(fèi)馬小定理屬于歐拉定理的特殊情況:

如果兩個(gè)正整數(shù) m 和 n 互質(zhì),并且  n 為質(zhì)數(shù)!那么φ(n)的結(jié)果就是 n - 1 ;

費(fèi)馬小定理公式:

費(fèi)馬小定理公式.png

四、模反元素&公式推導(dǎo)


1、模反元素

如果兩個(gè)正整數(shù) e 和 x 互質(zhì),那么一定可以找到整數(shù) d , 使得ed - 1 被 x 整除,那么 d 就是 e 對(duì)于 x 的 “模反元素”

模反元素公式:

模反元素公式.png

2、公式推導(dǎo)

公式轉(zhuǎn)換.png
模反元素公式轉(zhuǎn)換.png

根據(jù)上面模反元素的性質(zhì),e 是和 x 互質(zhì);

如果x == φ(n), 也就是 e 和 φ(n)互質(zhì);

套入模反元素的公式推理就能得出最后的公式:

最終公式.png

到這里我提醒一下:m 經(jīng)過(guò)一系列變換仍然能夠還原成 m ,只需要滿(mǎn)足兩個(gè)條件,這兩個(gè)條件是公式轉(zhuǎn)化的必要條件

1、m 和 n 互質(zhì)
2、e 和 φ(n)互質(zhì)

推理的過(guò)程中 d 是 e 對(duì)于 x 的模反元素,x = φ(n)的時(shí)候滿(mǎn)足公式轉(zhuǎn)化, 所以 d 也是 e 對(duì)于 φ(n) 的模反元素;但是由于 d 是 模反元素,所以上述兩個(gè)條件中的第一個(gè)條件,m 和 n 即使沒(méi)有互質(zhì)關(guān)系,該等式一樣可以成立,但是需要需要滿(mǎn)足另外一個(gè)條件 m < n;具體驗(yàn)證可自行驗(yàn)證一下(數(shù)學(xué)家驗(yàn)證過(guò)的定理)

所以得到了最終的公式及滿(mǎn)足公式的條件


公式:

最終公式.png

條件:

1、 m 小于 n 
2、 e 和 φ(n) 互質(zhì)


五、迪菲赫爾曼秘鑰交換


1、密鑰交換原理圖及流程示意圖(實(shí)質(zhì)上就是拆分了歐拉定理)

RSA原理.png
RSA原理示意圖.png

2、RSA算法

m ^ e mod n = c    加密
c ^ d mod n = m    解密

公鑰:n 和 e ,主要是 e 
私鑰:n 和 d ,主要是 d
明文:m
密文:c

3、RSA算法說(shuō)明

1、n會(huì)非常大,長(zhǎng)度一般為1024個(gè)二進(jìn)制位。(目前人類(lèi)已經(jīng)分解的最大整數(shù),232個(gè)十進(jìn)制位,768個(gè)二進(jìn)制位)

2、由于需要計(jì)算出φ(n),所以根據(jù)歐拉函數(shù)的特點(diǎn),最簡(jiǎn)單的方式n由兩個(gè)質(zhì)數(shù)相乘得到,質(zhì)數(shù)p1,p2

φ(n) = (p1 - 1) * (p2 - 1);

3、最終由φ(n)得到 e 和 d。

總共生成6個(gè)數(shù)字:p1、p2、n、φ(n)、 e 、 d

4、RSA安全問(wèn)題

除了公鑰用到了 n 和 e,其余的四個(gè)數(shù)字是不公開(kāi)的。
目前破解RSA得到d的方式如下:
1、要想求出私鑰d。由于e * d = φ(n) * k + 1 ; 必須要知道e 和 φ(n);
2、e 是知道的,但是要得到 φ(n),必須知道 p1和p2;
3、由于n = p1 * p2; 只有把 n 因式分解才能算出來(lái); 但是因?yàn)?n 非常大,分解成兩個(gè)質(zhì)數(shù)的難度不言而喻,和暴力破解差不多,只能不斷的去嘗試。

5、RSA延伸應(yīng)用思考

由于RSA原理算法推導(dǎo),最開(kāi)始就有一個(gè)條件,就是 m < n, 盡管n會(huì)取非常大,但是理論上仍然會(huì)限制RSA加密的使用,所以RSA加密不適用于加密非常非常大的數(shù)據(jù),效率比較低,一般結(jié)合其他加密方式來(lái)加密關(guān)鍵部分的數(shù)據(jù)。比如加密key,數(shù)字簽名

六、終端演示:RSA加密


一、終端加密指令OpenSSL使用RSA:
由于Mac系統(tǒng)內(nèi)置OpenSSL(開(kāi)源加密庫(kù)),所以我們直接在終端上使用命令來(lái)玩RSA,OpenSSL公開(kāi)庫(kù)中RSA算法常用命令主要有三個(gè):

命令1:genrsa  -> 生成并輸入一個(gè)RSA私鑰
命令2:rsautl  -> 使用RSA密鑰進(jìn)行加密、解密、簽名和驗(yàn)證等運(yùn)算
命令3:處理RSA密鑰的格式轉(zhuǎn)換等問(wèn)題

1、生成RSA私鑰,密鑰長(zhǎng)度為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、通過(guò)公鑰文件public.pem加密明文文件message.txt,生成enc.txt

openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

5、通過(guò)私鑰文件private.pem解密公鑰加過(guò)密的文件enc.txt并生成解密之后的文件dec.txt

openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt

二、終端加密實(shí)踐實(shí)例

實(shí)例我在里面加入了各步驟的注釋含義

步驟1. cd到一個(gè)文件夾下
battleMage:~ battleMage$ cd /Users/fightmaster/Desktop/RSA密碼學(xué)MacDown 

步驟2. 生成私鑰并輸出一個(gè)叫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ù)私鑰提取一個(gè)公鑰,并輸出一個(gè)叫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. 生成一個(gè)示例message.txt的需要加密的內(nèi)容文件,編輯message.txt文件,隨意填寫(xiě)一個(gè)示例文本,比如"密碼123456"
battleMage:RSA密碼學(xué)MacDown battleMage$ vi message.txt

步驟9. 將message.txt文件通過(guò)公鑰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加密后的文件(看起來(lái)是亂碼)
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、通過(guò)私鑰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


步驟2:得到的私鑰文件private.png

步驟3:從私鑰中提取出來(lái)的公鑰文件public.pem

步驟3:從私鑰中提取出來(lái)的公鑰文件public.png

步驟6:輸出查看的私鑰txt文件 private.txt

步驟6:輸出查看的私鑰txt文件 private.txt .png

步驟8:生成一個(gè)需要加密的message.txt文件,編輯內(nèi)容為"密碼123456"

步驟8:生成一個(gè)需要加密的message.txt文件.png

步驟9:message.txt通過(guò)公鑰文件public.pem加密并輸出對(duì)應(yīng)的加密文件enc.txt

步驟9:message.txt通過(guò)公鑰文件public.pem加密并輸出對(duì)應(yīng)的加密文件enc.png

步驟11:通過(guò)私鑰private.pem解密之前加密的密文enc.txt,并生成解密后的文件dec.txt

步驟11:通過(guò)私鑰private.pem解密之前加密的密文enc.txt,并生成解密后的文件dec.png

七、證書(shū)生成


如果我們想要使用RSA算法,那么我們需要對(duì)應(yīng)的證書(shū)文件,但是在項(xiàng)目開(kāi)發(fā)中,蘋(píng)果是不允許我們直接使用pem證書(shū)的,我們要生成對(duì)應(yīng)的crt文件
需要多次填寫(xiě)證書(shū)的信息,比如下面的國(guó)家,省,市,組織信息,郵箱Email,還有證書(shū)額外的密碼

/Users/fightmaster/Desktop/RSA密碼學(xué)MacDown/終端操作演示文件

步驟1:根據(jù)私鑰private.pem生成一個(gè)RSA證書(shū)請(qǐng)求文件
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請(qǐng)求文件,申請(qǐng).crt證書(shū)文件
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文件打開(kāi)的密碼(密碼可以不設(shè)置)
battleMage:終端操作演示文件 battleMage$ openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
Enter Export Password:
Verifying - Enter Export Password:
battleMage:終端操作演示文件 battleMage$ 

終端演示生成文件如下

步驟1,生成的證書(shū)請(qǐng)求文件.png
步驟2,根據(jù)請(qǐng)求文件申請(qǐng)的證書(shū)文件.png
步驟3,根據(jù)證書(shū)文件導(dǎo)出的p.p12文件.png

八、base64編碼


base64只是一種編碼方案,根據(jù)base64對(duì)照表將任意的二進(jìn)制進(jìn)行編碼;base64主要是為了查看二進(jìn)制,只是二進(jìn)制的一種表現(xiàn)形式

base64 總共 65種字符,0 ~ 9,a ~ z,A ~ Z 還有'+','/'和'=',將二進(jìn)制以每6個(gè)為一組進(jìn)行編碼;

base64編碼表中只有64個(gè)字符,編碼表中不包含'=','='是隱含的第65個(gè)字符,'='是用來(lái)補(bǔ)足最后拆成6位不足的

比如原二進(jìn)制
0101 1000 0101 0101 0001
經(jīng)過(guò)base64以6位為分割,變成
010110 000101 010100 01
不足6位后都補(bǔ)0,變成
010110 000101 010100 010000
因?yàn)榇鎯?chǔ)的時(shí)候,內(nèi)存需要對(duì)齊,所以可能最后幾個(gè)補(bǔ)齊的位置為
010110 000101 010100 010000 000000 000000

后面的這種形式的'000000'就會(huì)被替換為'=';所以base64編碼一般都很明顯,最后幾位一般都是'=';

下面是base64位編碼表:

base64編碼表.png

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;
}

今天就到這里,看完有收獲,點(diǎn)個(gè)贊謝謝啦~

溪浣雙鯉的技術(shù)摸爬滾打之路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • RSA算法簡(jiǎn)單介紹: RSA算法是非對(duì)稱(chēng)加密算法,在1977年被羅納德·李維斯特(Ron Rivest)、阿迪·薩...
    SharaYuki閱讀 2,034評(píng)論 0 7
  • 密碼學(xué) 密碼學(xué)是指研究信息加密,破解密碼的技術(shù)科學(xué)。密碼學(xué)的起源可追溯到2000年前。而當(dāng)今的密碼學(xué)是以數(shù)學(xué)為基礎(chǔ)...
    king_jensen閱讀 1,484評(píng)論 0 0
  • 推薦閱讀:iOS開(kāi)發(fā)——BAT面試題合集(持續(xù)更新中) 要講逆向,那么肯定少不了密碼學(xué),因?yàn)樗械哪嫦?攻防)都是...
    iOS開(kāi)發(fā)之家閱讀 848評(píng)論 0 0
  • 密碼學(xué)是在編碼與破譯的斗爭(zhēng)實(shí)踐中逐步發(fā)展起來(lái)的,并隨著先進(jìn)科學(xué)技術(shù)的應(yīng)用,已成為一門(mén)綜合性的尖端技術(shù)科學(xué)。 密碼學(xué)...
    我叫Vincent閱讀 24,216評(píng)論 0 19
  • RSA算法是非對(duì)稱(chēng)加密算法,在1977年被羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Sham...
    妖精的菩薩閱讀 466評(píng)論 0 1

友情鏈接更多精彩內(nèi)容