iOS逆向——從RSA說起

403同學發表於2019-09-30

文章僅供課後複習總結,感謝hank老師。

密碼學

       密碼學是指研究資訊加密,破解密碼的技術科學。 密碼學的起源可追溯到2000年前。而當今的密碼學 是以數學為基礎的。

       密碼學的歷史大致可以追溯到兩千年前,相傳古羅馬名將凱撒大帝為了防止敵方截獲情報,用密碼傳送情報。凱撒 的做法很簡單,就是對二十幾個羅馬字母建立一張對應表。這樣,如果不知道密碼本,即使截獲一段資訊也看不懂。 

       從凱撒大帝時代到上世紀70年代這段很長的時間裡,密碼學的發展非常的緩慢,因為設計者基本上靠經驗。沒有運 用數學原理。

iOS逆向——從RSA說起

發展歷史

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

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

• 1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德 曼(Leonard Adleman)一起設計了一種演算法,可以實現非對稱加密。這個演算法用他們三個人的名字命名,叫做 RSA演算法。

RSA數學原理

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

那麼我們來思考一下,加密容易破解很難的運算?

方案:

3^? % 17 =12

尤拉函式

任意給定正整數n,請問 在小於等於n的正整數之 中,有多少個與n構成互 質關係?

計算這個值的方式叫做尤拉函式,使用:Φ(n)表示 如:

計算8的尤拉函式,和8互質的 1、2、3、4、5、6、7、8 φ(8) = 4

計算7的尤拉函式,和7互質的 1、2、3、4、5、6、7 φ(7) = 6

計算56的尤拉函式 φ(56) = φ(8) * φ(7) = 4 * 6 = 24

PS:如果兩個正整數,除了1以外,沒有其他公因數, 我們就稱這兩個數是互質關係(coprime)。

尤拉函式特點:

一、當n是質數的時候,φ(n)=n-1。

二、如果n可以分解成兩個互質的整數之積,如 n=A*B則: φ(A*B)=φ(A)* φ(B) 根據以上兩點得到: 如果N是兩個質數P1 和 P2的乘積則 φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)

尤拉定理:

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

iOS逆向——從RSA說起

費馬小定理:

尤拉定理的特殊情況:如果兩個正整數m和n互質,而 且n為質數!那麼φ(n)結果就是n-1。

iOS逆向——從RSA說起

公式轉換


iOS逆向——從RSA說起

迪菲赫爾曼交換:

iOS逆向——從RSA說起

原理:


iOS逆向——從RSA說起

RSA的誕生:

iOS逆向——從RSA說起

所以m^e mod n = c 加密

       c^d mod n = m 解密

公鑰:n和e

私鑰:n和d

明文:m

密文:c

說明: 

  1. n會非常大,長度一般為1024個二進位制位。(目前人類已經分解的最大整數,232個十進位制位,768個二進位制位)
  2.  由於需要求出φ(n),所以根據歐函式特點,最簡單的方式n 由 兩個質數相乘得到: 質數:p1、p2 Φ(n) = (p1 -1) * (p2 - 1) 3、最終由φ(n)得到e 和 d 。 總共生成6個數字:p1、p2、n、φ(n)、e、d
關於RSA的安全: 除了公鑰用到了n和e 其餘的4個數字是不公開的。 目前破解RSA得到d的方式如下: 1、要想求出私鑰 d 。由於e*d = φ(n)*k + 1。要知道e和φ(n); 2、e是知道的,但是要得到 φ(n),必須知道p1 和 p2。 3、由於 n=p1*p2。只有將n因數分解才能算出。


OpenSSL使用RSA

  • 生成RSA私鑰,金鑰長度為1024bit

$ openssl genrsa -out private.pem 1024複製程式碼
  • 從私鑰中提取公鑰

$ openssl rsa -in private.pem -pubout -out public.pem複製程式碼
  • 生成如下檔案

iOS逆向——從RSA說起

  • 將私鑰轉換成明文

$ openssl rsa -in private.pem -text -out private.txt複製程式碼
  • 檢視文字資訊

$ cat private.txt複製程式碼

  • 通過公鑰加密資料,私鑰解密資料

$ vi message.txt //生成明文檔案
$ cat message.txt //檢視檔案內容
密碼:12345
$ 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 //通過私鑰進行解密複製程式碼

如下檔案:

iOS逆向——從RSA說起

  • 通過私鑰加密資料,公鑰解密資料

//通過私鑰加密
$ 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複製程式碼


相關文章