iOS逆向-07:RSA加密算法原理

密碼學

是指研究信息加密、破解密碼的技術科學。最早可以追溯到追溯到2000年前。而當今的密碼學是以數學為基礎的。

密碼學發展史

在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種算法。在交互數據的時候,彼此通信的雙方就必須將規則告訴對方,否則沒法解密。那么加密和解密的規則(簡稱密鑰),它保護就顯得尤其重要。傳遞密鑰就成為了最大的隱患。這種加密方式被成為對稱加密算法(symmetric encryption algorithm)

1976年,兩位美國計算機學家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,可以在不直接傳遞密鑰的情況下,完成密鑰交換。這被稱為“迪菲赫爾曼密鑰交換”算法。開創了密碼學研究的新方向,后期就出現了RSA加密算法

RSA加密算法

上世紀70年代產生的一種加密算法。其加密方式比較特殊,需要兩個密鑰:公開密鑰簡稱公鑰(publickey)和私有密鑰簡稱私鑰(privatekey)。公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個加密算法被稱為的RSA

RSA數學原理

上世紀70年代產生的一種加密算法。其加密方式比較特殊,需要兩個密鑰:公開密鑰簡稱公鑰(publickey)和私有密鑰簡稱私鑰(privatekey)。公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個加密算法被稱為的RSA

數學知識

1.質數

一個大于1的自然數,除了1和它本身外,不能被其他自然數整除(除0以外)的數稱之為質數(素數);否則稱為合數。

2.互質數

互質,又稱互素。若N個整數的最大公因子是1,則稱這N個整數互質。

離散對數問題

現在想實現這一種 加密容易,但是破解很難的加密算法,利用數學運算,如mod取模,有如下方案:

  • 質數做模數,例如17

  • 找一個比17小的數作為n次方的基數,例如3

  • 找出基數的n次方 mod 質數 = 固定的數,求n

3^? mod 17 = 12,此時的`?`是多少呢?(mod -> 求余數,在西方被稱為時鐘算數)

image.png

從上圖的規律中可以看出,3的1次方~16次方 mod 17 得到的結果都是不同的,且結果分布在 [1,17)上。此時將 3 稱為 17原根

所以根據圖中所示,? 可能是13,可能是29等。即從這里可以看出:通過 12 去反推3的?次方是很難的。如果質數加大,反推的難度也會加大。

歐拉函數φ

定義

任意給定正整數n,在小于n的正整數之中,有多少個與n構成互質關系?計算這個值的方式就叫做歐拉函數,使用Φ(n)表示

歐拉函數特點

  • 1、當n是質數時,Φ(n) = n - 1,比如φ(5) = 4

  • 2、如果n可以分解成兩個互質的整數之積,例如 n = A * B,則Φ(A * B) = Φ(A) * Φ(B)

所以,根據歐拉函數的以上兩個特點,可以得到如下結論:

  • 如果N是兩個互質數P1和P2乘積,則Φ(N) = Φ(P1 * P2) = Φ(P1) * Φ(P2) = (P1-1) * (P2-1)

比如φ(15) = φ(3)* φ(5) = 2 * 4 = 8

歐拉定理

如果兩個正整數 m 和 n 互質,那么 m 的Φ(n)次方減去1,可以被n整除。即

m^Φ(n) mod n ≡ 1
比如 13 和 14 互質 ,那么 13 ^ 6 % 14 = 1
φ(14)= φ(2)φ(7) = 16 = 6

費馬小定理(歐拉定理的特殊情況)

如果兩個正整數 m 和 n 互質,而且 n 為質數,那么 Φ(n) 結果就是 n-1,即
m^(n-1) mod n = 1

  • 例如 m=6,n=5,那么 6^(5-1) mod 5 = 1

公式轉換

前提:m和n互為質數,且n為質數,有公式m^Φ(n) mod n ≡ 1

  • 由于1^k ≡ 1 ==> m^k*Φ(n) mod n ≡ 1

    • 推導:將x = m^Φ(n) mod n 看作一個整體 ==> x^k = m^(Φ(n)*k) mod n(是一個定理) 成立

    • 例如:m=6,n=7,則6^(7-1) mod 7 = 1 ==> 6^(6*2) mod 7 = 1

  • 由于1*m ≡ m ==> m^(k*Φ(n)+1) mod n ≡ m(成立條件:m 要比 n小

    • 例如:m=6,n=7,則6^(6*3+1) mod 7 = m
python驗證

模反元素

如果兩個正整數 e 和 x 互質,那么一定就可以找到整數d,使得 ed - 1 被x整除(即 (ed - 1)/x = 1),那么 d 就是 e 對于 x模反元素

  • e * d mod x = 1
  • e * d ≡ k*x + 1
  • m^(e*d) mod n = m
  • m^(k*Φ(n)+1) mod n ≡ m

e和x互質,x相當于φ(n),也就是__ **e和φ(n)要互質 **__

- m :4
- n :15
- Φ(n):8
- e:(和Φ(n)互質)3
- d:3d-1=8k ==> d=(8k+1)/3 ==> d=11 19
- 4**(3*11)%15 = 4
- 4**(3*19)%15 = 4

迪菲赫爾曼密鑰交換

image.png
  • 1、服務端先取一個隨機數15,通過 3^15 mod 17 = 6,將6傳給客戶端(第三方可以竊取這個6)

  • 2、客戶端通用的取一個隨機數13,通過3^13 mod 17 = 12,將12傳給服務器(第三方同樣可以竊取這個12)

  • 3、客戶端拿到服務器傳過來的6,通過6^13 mod 17 = 10,得到10

  • 4、服務端拿到客戶端傳過來的12,通過12^15 mod 17 = 10,得到10

  • 所以綜上所述,服務端和客戶端想交換的數字是 10

以下是迪菲赫爾曼密鑰交換的原理,最終經過兩次計算,客戶端和服務端都會得到一個相同的數字,用于數據的傳輸

image.png
  • 客戶端:3 ^ 15 mod 17 = 6 + 6^13 mod 17 = 10 ==> 3 ^ (15 * 13) mod 17 = 10

  • 服務端:3 ^ 13 mod 17 = 12 + 12^15 mod 17 = 10 ==> 3 ^ (13 * 15) mod 17 = 10

RSA的誕生

由上面的迪菲赫爾曼密鑰交換原理可知,由以下三個公式

- 1、m^e mod n = C
- 2、C^d mod n = m^(e*d) mod n
- 3、m^(e*d) mod n = m

image.png

其中c^d mod n = m ,主要是源于 c^d mod n = m^(e*d)mod n = m ,且d 是 e 相對于 φ(n)的模反元素。需要注意的是:m 和 n 既為互質,m也是n的原根

RSA算法

所以最終RSA算法的加解密公式為:

  • 加密:m^e mod n = c

  • 解密:c^d mod n = m

  • 公鑰:n和e

  • 私鑰:n和d

  • 明文:m

  • 密文:c

  • 1、n會非常大,長度一般為1024個二進制位(目前人類已經分解的最大整數,232個十進制位,768個二進制位),這么大的數字,幾乎沒法求φ(n),除非給定p1和p2

  • 2、由于需要求出φ(n),所以根據歐拉函數特點,最簡單的求解φ(n)方式:n由兩個質數相乘得到 質數:p1、p2

    • Φ(n) = (p1 -1) * (p2 - 1)
  • 3、最終由 Φ(n) 得到 e 和 d

  • 所以綜上所述,總共生成6個數字:p1、p2、n、Φ(n)、e、d

算法演示

m:取值 3 或 12
n:3*5(兩個質數相乘)

- φ(n) = (3-1)*(5-1)= 8
- e:3(e和Φ(n)互質)
- d:3d-1=8k ==> d = 11 / 19(由公式 e * d mod x = 1 求解)
- 加密:`m^e mod n = c` ==> 3^3 mod 8 = 3
- 解密:`c^d mod n = m` ==> 3^11 mod 8 = 3

關于RSA的安全說明
除了公鑰用到了ne,其余的4個數字是不公開的,目前破解RSA得到d的方式如下:

  • 1、要想求出私鑰 d,由于 e*d = φ(n)*k + 1。要知道eφ(n)

  • 2、e是知道的,但是要得到 φ(n),必須知道p1 和 p2。

  • 3、由于 n=p1*p2。只有將n因數分解才能算出。

RSA算法說明

  • RSA效率不高,因為是數學運算,且m不能大于n,大數據不適合用RSA加密,一般用對稱加密(用key)
    • 交換key時,用RSA加密

    • 大數據傳遞,其中大數據用key(即對稱算法)加密

RSA終端命令

由于Mac系統內置OpenSSL(開源加密庫),所以在mac的終端可以直接使用OpenSSl玩RSA,OpenSSL中RSA算法常用命令有3個

命令 含義
genrsa 生成并輸入一個RSA私鑰
rsautl 使用RSA密鑰進行加密、解密、簽名和驗證等運算
rsa 處理RSA密鑰的格式轉換等問題

終端演示

  • 1、生成RSA私鑰,密鑰成都為1024bit

    • 命令:openssl genrsa -out private.pem 1024

    • 查看 cat private.pem文件,其中是base64編碼

image.png
  • 2、從私鑰中提取公鑰(即 n和e)

    • 命令:openssl rsa -in private.pem -pubout -out public.pem

    • 查看公鑰:cat public.pem

    image.png
  • 3、生成的文件如下
image.png
  • 4、將私鑰轉換為明文

    • 命令:openssl rsa -in private.pem -text -out private.txt

      image.png
  • 5、通過公鑰加密數據,私鑰解密數據

    • 生成明文文件: vi message.txt

    • 查看文件內容:cat message.txt

    • 通過公鑰進行加密:openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

    • 通過私鑰進行解密:openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
      生成的文件如下所示

    image.png
  • 6、通過私鑰加密數據,公鑰解密數據

    • 通過私鑰進行加密(簽名): openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt

    • 通過公鑰進行解密(驗證):openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt

RSA代碼演示

前提:準備好公鑰、私鑰,需要在終端生成(屬于自己簽名)

證書申請步驟

  • 1、申請CSR文件:keychain -> 證書助理 -> 從證書頒發機構請求證書

  • 2、生成CSR請求文件(證書頒發機構信息 + 公鑰)

    • 命令:openssl req -new -key private.pem -out rsacert.csr
  • 3、生成CRT證書(自己簽名,沒有認證的)

    • 命令:openssl x509 -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
  • 4、生成der文件

    • 命令:openssl x509 -outform der -in rsacert.crt -out rsacert.der
  • 5、獲取p12文件

    • 命令:openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt

注:代碼中使用der格式

拓展

  • 對稱加密(傳統加密算法):采用同一個同一把秘鑰進行加解密

  • RSA非對稱加密(現代加密算法):加解密原理來源迪菲赫爾曼密鑰交換

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容