10.1
a.YA=αXA=515Y_A = \alpha^{X_A} = 5^{15}YA=αXA=515
可得 Alice 给 Bob 的 public Key YAY_AYA 为 79
b.YB=αXB=527Y_B = \alpha^{X_B} = 5^{27}YB=αXB=527
可得Bob 给 Alice 的 public Key YBY_BYB 为 65
c.
Alice & Bob 之间共享的密钥为
YBXA=YAXBY_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 的密钥 XBX_BXB = 3
b.Bob 收到 Alice 发来的 YAY_AYA 后可以获取 Key = YAXB=83Y_A^{X_B} = 8^3YAXB=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;
}