10.1
a.
Y
A
=
α
X
A
=
5
15
Y_A = \alpha^{X_A} = 5^{15}
YA=αXA=515
可得 Alice 给 Bob 的 public Key Y A Y_A YA 为 79
b. Y B = α X B = 5 27 Y_B = \alpha^{X_B} = 5^{27} YB=αXB=527
可得Bob 给 Alice 的 public Key Y B Y_B YB 为 65
c.
Alice & Bob 之间共享的密钥为
Y B X A = Y A X B Y_B^{X_A} = Y_A^{X_B} YBXA=YAXB
10.2
q = 23 , g = 5
Bob: Yb = g^xb = 5^xb = 10, 求 xb
Alice: Ya = 8,求 Key = Ya^xa
用穷举法,求出 5 ^k , k ∈ [ 1 , q − 1 ] k\in[1, q-1] k∈[1,q−1]
a.可得当 k = 3 时,结果为 10,故有 Bob 的密钥 X B X_B XB = 3
b.Bob 收到 Alice 发来的 Y A Y_A YA 后可以获取 Key = Y A X B = 8 3 Y_A^{X_B} = 8^3 YAXB=83
c.观察图片1 可得 5 mod 23 的阶为 22, 故 5 是 q 的原根
ps.计算程序
int mul_mod(int a, int b, int mod) {
int res = 0;
int len = 0, t_b = b;
while (t_b) {
len++;
t_b /= 2;
}
for (int i = len-1; i >=0; i--) {
res <<= 1;
res %= mod;
if (b >> i & 1) {
res = (res + a) % mod;
}
}
return res;
}
int exp_mod(int a, int b, int mod){
cout << "计算中间结果如下:"<<endl;
int res = 1;
int len = 0, t_b = b;
while (t_b) {
len++;
t_b /= 2;
}
for(int k = len -1; k >= 0; k--){
res = mul_mod(res,res,mod);
if(b >> k & 1){
res = mul_mod(res, a, mod);
}
cout << "d = " << res <<";"<< endl;
}
return res;
}