密碼學—RSA加密解密詳解!

引言
CTF密碼學類題目中,RSA加密可謂是很重要且常見的加密類型,今天就總結下RSA加密的原理及解密方法。


RSA算法:

  • RSA加密算法是一種非對稱加密算法,RSA算法相比別的算法思路非常清晰,但是想要破解的難度非常大。
  • RSA算法基於一個非常簡單的數論事實:兩個素數相乘得到一個大數很容易,但是由一個大數分解爲兩個素數相乘卻非常難。
    在這裏插入圖片描述

公鑰和私鑰的生成:

第一步:隨機找兩個質數 P 和 Q ,P 與 Q 越大,越安全

比如 P = 67 ,Q = 71。計算他們的乘積 n = P * Q = 4757 ,轉化爲二進爲1001010010101,該加密算法即爲 13 位,實際算法是 1024 位 或 2048 位,位數越長,算法越難被破解。

第二步:計算 n 的歐拉函數 φ(n)

φ(n) 表示在小於等於 n 的正整數之中,與 n 構成互質關係的數的個數。例如:在 1 到 8 之中,與 8 形成互質關係的是1、3、5、7,所以 φ(n) = 4。 如果 n = P * Q,P 與 Q 均爲質數,則 φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。 本例中 φ(n) = 66 * 70 = 4620,這裏記爲 m, m = φ(n) = 4620

第三步:隨機選擇一個整數 e,條件是1< e < m,且 e 與 m 互質

公約數只有 1 的兩個整數,叫做互質整數,這裏我們隨機選擇 e = 101 請注意不要選擇 4619,如果選這個,則公鑰和私鑰將變得相同。

第四步:有一個整數 d,可以使得 e*d 除以 m 的餘數爲 1

即找一個整數 d,使得 (e * d ) % m = 1。 等價於e * d - 1 = y * m ( y 爲整數) 找到 d ,實質就是對下面二元一次方程求解。 e * x - m * y =1 ,其中 e = 101,m = 4620; 101x - 4620y =1 這個方程可以用擴展歐幾里得算法求解,此處省略具體過程。
總之算出一組整數解 (x,y )= ( 1601,35),即 d = 1601。 到此密鑰對生成完畢。不同的 e 生成不同的 d,因此可以生成多個密鑰對。 本例中公鑰爲 (n,e) = (4757 , 101),私鑰爲 (n,d) = (4757 ,1601) ,僅 (n,e) = (4757 , 101)是公開的,其餘數字均不公開。可以想像如果只有 n 和 e,如何推導出 d,目前只能靠暴力破解,位數越長,暴力破解的時間越長。

加密生成密文 :

比如甲向乙發送漢字“中”,就要使用乙的公鑰加密漢字 “中”, 以 utf-8 方式編碼爲 [e4 b8 ad],轉爲 10 進製爲 [228,184,173]。要想使用公鑰(n,e) = (4757 , 101)加密,要求被加密的數字必須小於 n,被加密的數字必須是整數,字符串可以取 ascii 值或unicode值,因此將“中”字折爲三個字節 [228,184,173],分別對三個字節加密。

假設 a 爲明文,b 爲密文,則按下列公式計算出 b

a^e % n = b 

計算 [228,184,173]的密文:

228^101 % 4757 = 4296
184^101 % 4757 = 2458
173^101 % 4757 = 3263

即 [228,184,173]加密後得到密文 [4296,2458,3263] ,如果沒有私鑰 d ,神仙也無法從 [4296,2458,3263]中恢復 [228,184,173]。

解密生成明文:

乙收到密文 [4296,2458,3263],並用自己的私鑰(n,d) = (4757 ,1601) 解密。解密公式如下:
假設 a 爲明文,b 爲密文,則按下列公式計算出 a

a^d % n = b 

密文 [4296,2458,3263] 的明文如下:

4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173

即密文 [4296,2458,3263] 解密後得到 [228,184,173]
將[228,184,173] 再按 utf-8 解碼爲漢字 “中”,至此解密完畢。

參考blog https://www.jianshu.com/p/fbb8bf7baa97

現在知道了加密解密的基本原理,下面就做幾個題展示下。


1.easy_RSA

在這裏插入圖片描述
打開附件:
在這裏插入圖片描述
這題很簡單,就是求參數d的值
那麼如何計算d呢?也就是如何求e * x - m * y =1 式子中的x的值,這個時候就需要了解以下擴展歐幾里得算法了,擴展歐幾里得算法詳解看完應該瞭解了計算的原理
這裏分享一個腳本(需要安裝gmpy2):

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import gmpy2

p = 473398607161
q = 4511491
e = 17

s = (p-1)*(q-1)
d = gmpy2.invert(e,s)
print('flag is :',d)

得到d=125631357777427553 flag爲cyberpeace{125631357777427553}
好,關於RSA的加密解密原理,就先總結到這吧,以後發現好用的方法或解題技巧會接着更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章