RSA-演變過程、原理、特點(加解密及簽名)及公鑰私鑰的生成
本篇是iOS逆向開發總結的第一篇文章,是關於iOS密碼學的相關技術分析和總結,希望對大家有所幫助,如果有錯誤地方歡迎指正。
一、前言
密碼學的歷史追溯到2000年前,相傳古羅馬凱撒大帝為了防止敵方截獲情報,用密碼傳送情報。凱撒大帝的做法比較簡單,通過對二十幾個羅馬字母表建立一張對應的表格,這樣如果不知道密碼,截獲也會沒有用。
在1976年前,所有的加密方法都是同一種模式:加密、解密使用同一種演算法。在資料互動的時候,彼此通訊雙方就必須將規則告訴對方,否則就沒法解密。加密和解密的規則也就是金鑰,保護它尤為顯得重要,傳遞金鑰就成了最大的隱患。這種加密方式被稱為對稱加密演算法。
1977年有三位麻省理工學院的數學家羅納德.李維斯特(Ron Rivest)、阿迪.薩默爾(Adi Shamir)和倫納德.阿德曼(Leonard Adleman)一起設計了演算法,可以實現非對稱加密。這個演算法就是用三個人的名字命名,叫做RSA演算法
RSA加密方式比較特殊,需要兩個金鑰:公開金鑰簡稱公鑰(publickey)和私有祕鑰簡稱私鑰(privatekey)。公鑰加密,私鑰加密;私鑰加密,公鑰解密。這個演算法就是偉大的RSA演算法。
- RSA加密或者簽名後的結果都是不可逆的二進位制,使用時大部分都會轉換為BASE64碼再傳輸。
- RSA加密時,對要加密的資料大小有限制,最大不大於金鑰的長度。列如在使用1024bit的金鑰時(
genrsa -out rsa_private_key.pem 1024
- 為了保證每次加密的結果都不相同,RSA加密時在待加密資料之後拼接一個隨機字串,然後再進行加密。不同的填充方式Padding表示字串的不同長度,在對超限資料進行分組之後,會按照Padding指定的長度新增到隨機字串。列如Padding填充方式使用預設OPENSSL_PKCS1_PADDING(需要佔用11個位元組用於填充)那麼這樣明文長度最多就是128-11=117Bytes。
- 接收方解密也需要分組。將加密後的原始二進位制資料每128 Bytes分為一組中,然後再進行解密,解密之後,根據Padding的長度進行丟棄隨機字串,把得到的原字串拼接起來,就得到原始報文。
二、RSA原理
RSA演算法的可靠性基礎: 對極大整數做因數分解是很困難的。
RSA是非對稱演算法,加解密使用不同的金鑰。
兩個金鑰都是可以用於加密,解密時需要另一個金鑰。但是,通常用公鑰加密,私鑰進行解密,因為公鑰是公開的。理論上A和B之間通過RSA實現保密通訊,需要A和B各自生成一組金鑰來,同時保管好自己的私鑰;而用對方的公鑰加密要傳送的訊息,用自己的私鑰解密對方發過來的訊息。
在簽名的場景下,用私鑰進行簽名,公鑰驗證。
RSA比DES等對稱加密要慢的多。一般在實際傳輸資料時,用RSA加密比較短的對稱密碼,雙方交換密碼後再使用DES等對稱演算法傳輸資料。
2.1 尤拉函式
尤拉函式: 求小於N的正整數中與N互質的數的個數
例如: 對應5, 與5互質的數總共有1,3,也就是φ(N) = 2。
RSA演算法是運用尤拉函式一個特例,如果N可以分解成兩個互質的整數的積: N = pq
則: φ(N) = φ(p)φ(q) = (p−1)(q−1)
例如: φ(35947) = φ(103)φ(349) = (103−1)(349−1)=35496
2.2 模反元素
兩個正整數a和n互質,那麼一定能找到整數b,使得ab -1 被n來整除,也就是ab ≡ 1 (mod n)
這時侯,b被叫做a的模反元素
RSA加密過程:
- 取兩個質數p1,p2
- 確定了n值,n = p1 * p2, n值一般會很大程度為1024個二進位制位;
- 確定φ(n),這樣
φ(n)=(p1-1) * (p2-1);
- 確定e值,
1<e<φ(n)
,e
為整數而且與φ(n)
互質; - 確定d值,
e*d%φ(n)=1;
- 加密 c = m^e%n;
- 解密 m=c^d%n
實際的驗證:
- p1 = 3, p2 = 7;
- n = p1 * p2 = 3 * 7 = 21;
- φ(n)=(p1-1) * (p2-1)=2*6=12;
- 1 < e < 12, e = 5 (12 與 e互質則取值{1,5,7,11}, φ(12) = 4)
- e * d % φ(n) = 5 * d % 12 = 1,則d =17
- 設定明文 m = 3, 則 c = m ^ e % n = 3 ^ 5 % 21 = 12
- 解密密文 m = c ^ d % n = 12 ^ 17 % 21 = 3
下面是資料傳輸過程圖解:
三、OpenSSL
openSSL是蘋果系統內建的開源加密庫,這樣我們就可以通過終端來獲取私鑰公鑰,進行資料加密.
主要命令:
1. 生成RSA私鑰
openssl genrsa -out private.pem 1024
2. 從私鑰中提取出公鑰
openssl rsa -in private.pem -pubout -out public.pem
3. 將私鑰轉換成為明文
openssl rsa -in private.pem -text -out private.txt
4. 經過公鑰進行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enmsg.txt
5. 經過私鑰進行解密
openssl rsautl -decrypt -in enmsg.txt -inkey private.pem -out demsg.txt
6. 經過私鑰進行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enmsg2.txt
7. 經過公鑰進行解密
openssl rsautl -verify -in enmsg2.txt -inkey public.pem -pubin -out demsg2.txt
終端使用:
1.建立公鑰私鑰
2. 檢視私鑰公鑰
3.建立文字
4. 公鑰加密
5. 私鑰解密
6. 私鑰加密
7. 公鑰解密
通過上面的7種方式,得到如下結果圖解:
大家可以通過終端嘗試上面的命令,用起來撒!!!
以後就是關於RSA的基本講解,希望對大家有所幫助!!!下一篇將講解雜湊演算法在逆向的使