1.RSA
知道?? flag.enc? 和? pub.key,典型的加密、解密
將pub,key? 改為pub.txt
打開后發現公鑰
在RSA公私鑰分解 Exponent、Modulus,Rsa公私鑰指數、系數(模數)分解--查錯網? 進行解密
得到e=65537???
n=86934482296048119190666062003494800588905656017203025617216654058378322103517
在python中轉化,模數是16進制的n
然后求p和q
后面來編寫腳本
import gmpy2
import rsa
num = "C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD"
N = int(num,16)
E = 65537
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
D = int(gmpy2.invert(E,(p-1)*(q-1)))
privkey = rsa.PrivateKey(N, E, D, p, q)
with open("C:\\Users\\HP\\Desktop\\flag.enc", "rb+") as file:text = file.read()
message = rsa.decrypt(text,privkey)
print(N)
print(message)
代碼核心:
??????? 從一個給定的公鑰參數(N 和E)以及私鑰的兩個質數因子(p和 q)來創建一個 RSA 私鑰,并使用這個私鑰來解密一個文件。
??????????? 代碼首先導入 gmpy2和 rsa 模塊,然后定義了一系列變量,包括公鑰的模數 N、公鑰的指數 E、兩個質數 p,q,以及通過 gmpy2.invert 函數計算出的私鑰指數 D。
?????????? 接下來創建一個rsa.PrivateKey? 對象,并嘗試打開一個加密文件來讀取其內容。解密后的消息被存儲在 message變量中,最后打印出公鑰的模數 N 和解密后的消息。
補充:
???
RSA 加密/解密
???? 在 RSA 加密/解密過程中,公鑰用于加密數據,私鑰用于解密數據。在這個例子中,你已經使用了公鑰的模數 N 和指數 E 來模擬(盡管沒有實際加密過程)公鑰,并用私鑰的質數因子 p和 q 來計算私鑰指數 D,然后用這個私鑰來解密一個文件。
RSA 簽名/驗證簽名
????? 在 RSA 簽名/驗證簽名過程中,私鑰用于生成簽名,公鑰用于驗證簽名。簽名通常附加在原始消息之后,以證明消息的真實性和完整性。
使用 RSA 私鑰生成簽名的過程大致如下:
- 發送者使用哈希函數(如 SHA-256)對原始消息進行哈希處理,得到一個固定長度的哈希值。
- 發送者使用其 RSA 私鑰和哈希算法對哈希值進行簽名,生成一個簽名值。
- 發送者將原始消息和簽名值一起發送給接收者。
????? 有wp說,這一題屬于簽名(公鑰加簽),但是這是錯誤的,只有擁有私鑰的A才能生成有效的簽名,所以簽名可以作為A的身份驗證,這是沒有涉及RSA簽名及驗證,
我們一般說地加簽和減簽,是說公鑰解簽,私鑰加簽
??
?? 公鑰解簽:
????當發送者(例如A)想要發送一條消息給接收者(例如B)并確保消息的真實性和完整性時,A會使用自己的私鑰對消息進行簽名。這個過程通常涉及對消息的哈希值進行加密,生成一個簽名。
?????? A將原始消息和簽名一起發送給B
???? 私鑰加簽:
?????????? B收到消息和簽名后,使用A的公鑰對簽名進行解密,得到原始消息的哈希值。
???? ????? B同時會對原始消息進行哈希運算,得到另一個哈希值。
????????如果B使用A的公鑰解密簽名得到的哈希值和B自己對原始消息進行哈希運算得到的哈希值相同,那么B就可以確認這條消息是由A發送的,并且沒有被篡改。
2.RSARoll
?? 根據題目:
RSA roll!roll!roll!Only number and a-z(don't use editor which MS provide)
先來查一下什么叫Roll?
????? 這里說得是Roll按行加密,
前面兩個 數n,e,后面是密文c
?????? 提醒:不要總是覺得 密文C 就是一連串的字符串,密文C 也可以是分行的,記住不要把分行符刪除讓 密文C 變為一個字符串。應該按行進行解密
來上腳本
直接輸出string,只得到},分析一下,它算了很多次私鑰,每一次都使用的d都相同,
雖然沒有錯誤,但引起了混淆
我們修改一下,加上一段
?? flag+=string.decode()
將每個解密后的字符串追加到flag變量中。這假設了每個密文解密后都直接對應一段可讀的文本,并且這些文本片段應該連續拼接。這在實際應用中可能并不總是正確的,特別是如果明文在加密前經過了某種形式的分割或編碼.
較好的代碼為:
import libnum
from Crypto.Util.number import long_to_byteslist1 = [# ... 你的密文列表 ...
]n = 920139713
q = 18443
p = 49891
e = 19# 計算私鑰的d部分,只需要做一次
phi_n = (p - 1) * (q - 1)
d = libnum.invmod(e, phi_n)for i in list1:c = i# 使用相同的d來解密所有的cm = pow(c, d, n)# 可能需要處理填充或轉換,這里只是簡單地將整數轉換為字節string = long_to_bytes(m)print(string)
結果:
合起來就可了
補充:
??? 歐幾里得算法
主要運用在計算模逆元(或乘法逆元)
詳細在中國剩余定理 - OI Wiki