傳送門
題目描述:
diffie-hellman 金鑰交換協議是一種簡單有效的金鑰交換方法。它可以讓通訊雙方在沒有事先約定金鑰(密碼)的情況下,通過不安全的通道(可能被竊聽)建立乙個安全的金鑰 k
kk,用於加密之後的通訊內容。
假定通訊雙方名為 alice 和 bob,協議的工作過程描述如下(其中 mod
modmo
d 表示取模運算):
協議規定乙個固定的質數 p
pp,以及模 p
pp 的乙個原根 g
gg。p
pp 和 g
gg 的數值都是公開的,無需保密。
alice 生成乙個隨機數 a
aa,並計算 a=g
amod
p\mathrm a=g^a\; \mathrm \;p
a=gamo
dp,將 a
\mathrm a
a 通過不安全通道傳送給 bob。
bob 生成乙個隨機數 b
bb,並計算 b=g
bmod
p\mathrm b=g^b\; \mathrm\; p
b=gbmo
dp,將 b
\mathrm
b 通過不安全通道傳送給 alice。
bob 根據收到的 a
\mathrm a
a 計算出 k=a
bmod
pk=\mathrm a^b\;\mathrm \;p
k=abmo
dp,而 alice 根據收到的 b
\mathrm
b 計算出 k=b
amod
pk=\mathrm b^a\; \mathrm\; p
k=bamo
dp。雙方得到了相同的 k
kk,即 gab
modp
g^\;\mathrm\;p
gabmod
p。kk
k 可以用於之後通訊的加密金鑰。
可見,這個過程中可能被竊聽的只有 a
\mathrm a
a、b\mathrm b
b ,而 a
aa、b
bb、k
kk 是保密的。並且根據 a
\mathrm a
a、b\mathrm b
b、pp
p、gg
g 這 4
44 個數,不能輕易計算出 k
kk ,因此 k
kk 可以作為乙個安全的金鑰。
當然安全是相對的,該協議的安全性取決於數值的大小,通常 a
aa、b
bb、p
pp 都選取數百位以上的大整數以避免被破解。然而如果 alice 和 bob 程式設計時偷懶,為了避免實現大數運算,選擇的數值都小於 2
312^
231,那麼破解他們的金鑰就比較容易了。
輸入格式:
輸入檔案第一行包含兩個空格分開的正整數 g
gg 和 ppp。
第二行為乙個正整數 n
nn,表示 alice 和 bob 共進行了 n
nn 次連線(即執行了 n
nn 次協議)。
接下來 n
nn 行,每行包含兩個空格分開的正整數 a
\mathrm a
a 和 b
\mathrm b
b ,表示某次連線中,被竊聽的 a
\mathrm a
a、b\mathrm b
b 數值。
輸出格式:
輸出包含 n
nn 行,每行 1
11 個正整數 k
kk,為每次連線你破解得到的金鑰。
樣例資料:輸入
3 31
327 16
21 3
9 26 輸出
42125
備註:
【資料規模】
對於 30
%30\%
30% 的資料,2≤a
,b,p
≤1000
2≤\mathrm a,\mathrm b,p≤1000
2≤a,b,
p≤10
00;對於 100
%100\%
100%
的資料,2≤a
,b
<
p<231
2≤\mathrm a,\mathrm b2≤
a,b<
p<23
1,2≤
g<
202≤g<20
2≤g<20
,1 ≤n
≤20
1≤n≤20
1≤n≤20
。bsgs 模板題。
題目意思就是,已知 ga%
pg^a\%p
ga%p
,g b%
pg^b\%p
gb%p
,求 gab
%p
g^\%p
gab%p。
那麼先用 bsgs 解出 a,b
a,ba,
b,然後用快速冪算 gab
%p
g^\%p
gab%
p 就可以了。
很簡單的一道題。
#include
#define ll long long
using
namespace std;
int g,p,n;
unordered_map<
int,
int>hash;
intpower
(ll a,ll b,
int p)
intbsgs
(int a,
int b,
int p)
}int
main()
return0;
}
CQOI2018 破解D H協議
題目鏈結 已知 g a a 和 g b b 求 g bmod p 可以先求 a 再得 b a 也即,在 g a equiv a pmod p 中求 a 顯然 bsgs g 是原根,這就意味著 g t bmod p 0 leq t 如何加速?考慮一種拆分方法使得可以預處理一部分,即設 t i time...
BSGS CQOI2018 破解D H協議
bsgs演算法,又稱大小步演算法 某大神稱拔山蓋世演算法 主要用來解決 a x b mod c c是質數 都是整數,已知a b c求x。具體步驟如下 先把x i m j,其中m ceil sqrt c ceil是向上取整 這樣原式就變為a i m j b mod c 再變為a j b a m i m...
CQOI2018 社交網路
當今社會,在社交網路上看朋友的訊息已經成為許多人生活的一部分。通常,乙個使用者在社交網路上發布一條訊息 例如微博 狀態 tweet等 後,他的好友們也可以看見這條訊息,並可能 的訊息還可以繼續被人轉 發,進而擴散到整個社交網路中。在乙個實驗性的小規模社交網路中我們發現,有時一條熱門訊息最終會被所有人...