赞
踩
用matlab/python等作图工具,数值分析攻击信道容量。
在单挑盲攻防的背景下,将攻守双方过去 N 次对抗的“盲自评结果”记录下来,得到一个二维随机变量(X 和 Y 分别表示攻击方和守方盲自评的结果,0表示失败,1表示成功):
(
X
,
Y
)
=
(
X
1
,
Y
1
)
,
(
X
2
,
Y
2
)
,
.
.
.
,
(
X
N
,
Y
N
)
(X, Y) = (X_1, Y_1), (X_2, Y_2),...,(X_N, Y_N)
(X,Y)=(X1,Y1),(X2,Y2),...,(XN,YN)
当 N 趋于无穷大时,频率趋于概率Pr,所以,只要攻守双方足够长
时间对抗之后,得到随机变量X、Y的概率分布如下:
Pr(攻方盲自评为成功) = Pr(X=1) = p
Pr(攻方盲自评为失败) = Pr(X=0) = 1 - p,0 < p < 1
Pr(守方盲自评为成功) = Pr(Y=1) = q
Pr(守方盲自评为失败) = Pr(Y=0) = 1 - q,0 < q < 1
Pr(攻方盲自评为成功,守方盲自评为成功) = Pr(X=1,Y=1) = a,0 < a < 1
Pr(攻方盲自评为成功,守方盲自评为失败) = Pr(X=1,Y=0) = b,0 < b < 1
Pr(攻方盲自评为失败,守方盲自评为成功) = Pr(X=0,Y=1) = c,0 < c < 1
Pr(攻方盲自评为失败,守方盲自评为失败) = Pr(X=0,Y=0) = d,0 < d < 1
即,p 和 q 是攻方和守方盲自评成功的概率,a、b、c、d 表示攻方和守方盲自评结果的联合概率。X 和 Y 的联合概率与边缘概率表示如下:
Y = 1 | Y = 0 | Y | |
---|---|---|---|
X = 1 | a | b | p |
X = 0 | c | d | 1 - p |
X | q | 1 - q |
这里,a、b、c、d、p、q 之间还满足下列关系:
以 X 作为输入,Z 作为输出,构造出一个通信信道 F,称之为攻击信道。
如果黑客的某次攻击真正成功,那么攻击信道 F 就成功地传输 1 bit 到收端;如果有 1 bit 被成功地从攻击信道 F 的发端,传送到了收端,那么黑客 X 就获得了一次真正成功攻击。
引理 1:黑客获得一次真正成功的攻击,其实就对等于攻击信道 F 成功地传输了 1 bit。
定理 1(黑客攻击能力极限定理):设由随机变量(X;Z)组成的攻击信道 F 的信道容量为 C。那么:如果黑客想真正成功地把红客打败 k 次,一定有某种技巧(对应于仙农编码),使得他能够在 k/C 次攻击中,以任意接近 1 的概率达到目的;如果黑客经过 n 次攻击,获得了 S 次真正成功的攻击,一定有 S ≤ nC。
根据定理 1,只要求出攻击信道 F 的信道容量 C,那么黑客的攻击能力极限就确定了。
根据补充章节 1,在单用户信道中,信道容量 = max 互信息。
随机变量 (X,Z) 的联合概率分布为:
Pr (X=0, Z=0) = Pr (X=0,Y=0) = d
Pr (X=0, Z=1) = Pr (X=0,Y=1) = c
Pr (X=1, Z=0) = Pr (X=1,Y=1) = a
Pr (X=1, Z=1) = Pr (X=1,Y=0) = b
结合 X 和 Z 构成的通信系统 F 的转移矩阵
A
=
[
A
(
0
,
0
)
A
(
0
,
1
)
A
(
1
,
0
)
A
(
1
,
1
)
]
=
[
d
1
−
p
1
−
d
1
−
p
a
p
1
−
a
p
]
A =
随机变量 X 和 Z之间的互信息为
I
(
X
,
Z
)
=
∑
x
∑
z
p
(
x
,
z
)
log
p
(
x
,
z
)
p
(
x
)
p
(
z
)
=
d
log
d
(
1
−
p
)
(
a
+
d
)
+
c
log
c
(
1
−
p
)
(
b
+
c
)
+
a
log
a
p
(
a
+
d
)
+
b
log
b
p
(
b
+
c
)
又由于 a + b + c + d = 1,p = a + b,q = a + c,0 < a, b, c, d, p, q < 1,可以进一步转化为只与变量a和p有关的如下公式(注意:此时q已不再是变量,而是确定值了)
I
(
X
,
Z
)
=
[
1
+
a
−
p
−
q
]
log
1
+
a
−
(
p
+
q
)
(
1
−
p
)
(
1
+
2
a
−
p
−
q
)
+
(
q
−
a
)
log
q
−
a
(
1
−
p
)
(
p
+
q
−
2
a
)
+
a
log
a
p
(
1
+
2
a
−
p
−
q
)
+
(
p
−
a
)
log
p
−
a
p
(
p
+
q
−
2
a
)
利用此
I
(
X
,
Z
)
I(X, Z)
I(X,Z) 就可知:以 X 为输入,Z 为输出的信道 F 的信道容量
C
=
m
a
x
[
I
(
X
,
Z
)
]
C = max[I(X, Z)]
C=max[I(X,Z)](这里最大值是针对 X 为所有可能的二元离散随机变量来计算的)。
在此处一对一的信道中,其容量
C
=
m
a
x
0
<
a
,
p
<
1
[
I
(
X
,
Z
)
]
C = max_{0<a,p<1}[I(X,Z)]
C=max0<a,p<1[I(X,Z)],这里的最大值是对仅仅两个变量 a 和 p 在条件 0 < a,p < 1 下之取的,也就是说 攻击信道容量 C,其实是 q 的函数。
根据攻击信道容量公式
C
=
m
a
x
0
<
a
,
p
<
1
[
I
(
X
,
Z
)
]
=
m
a
x
0
<
a
,
p
<
1
[
(
1
+
a
−
p
−
q
)
log
1
+
a
−
(
p
+
q
)
(
1
−
p
)
(
1
+
2
a
−
p
−
q
)
+
(
q
−
a
)
log
q
−
a
(
1
−
p
)
(
p
+
q
−
2
a
)
+
a
log
a
p
(
1
+
2
a
−
p
−
q
)
+
(
p
−
a
)
log
p
−
a
p
(
p
+
q
−
2
a
)
]
下面给出以 q 为自变量的攻击信道容量的数值分析函数:
# Compute mutual information def get_i(a, p ,q): c1 = 1 + a - p - q c2 = q - a c3 = p - a c4 = 1 + 2 * a - p - q c5 = p + q - 2 * a i1 = c1 * np.log(c1 / ((1 - p) * c4)) i2 = c2 * np.log(c2 / ((1 - p) * c5)) i3 = a * np.log(a / (p * c4)) i4 = c3 * np.log(c3 / (p * c5)) i = i1 + i2 + i3 + i4 return i # def get_max_i(i): def get_max_i(a, p ,q): i = get_i(a, p ,q) i = np.nan_to_num(i) max_i = np.max(i) # print(max_i) # print(i) return max_i
其中 get_i
函数是根据公式 I(X, Z)
计算互信息,get_max_i
函数是根据
C
=
m
a
x
0
<
a
,
p
<
1
[
I
(
X
,
Z
)
]
C = max_{0<a,p<1}[I(X,Z)]
C=max0<a,p<1[I(X,Z)] 计算信道容量,即最大的互信息。画出攻击信道容量的数值分析图像如下:
import numpy as np import matplotlib.pyplot as plt _p = np.arange(0.01, 1.00, 0.01) _q = np.arange(0.01, 1.00, 0.01) # Meshgrid for 2D array creation p, q = np.meshgrid(_p, _q) # 2D array outer product a = np.outer(_p, _q) # Compute mutual information def get_i(a, p ,q): c1 = 1 + a - p - q c2 = q - a c4 = p - a c5 = 1 + 2 * a - p - q c6 = p + q - 2 * a i1 = c1 * np.log(c1 / ((1 - p) * c5)) i2 = c2 * np.log(c2 / ((1 - p) * c6)) i3 = a * np.log(a / (p * c5)) i4 = c4 * np.log(c4 / (p * c6)) i = i1 + i2 + i3 + i4 return i i = get_i(a, p ,q) # Plotting fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(p, q, i, cmap='jet') # Axis labels ax.set_xlabel('p') ax.set_ylabel('q') ax.set_zlabel('I(X,Z)') # Title ax.set_title('Image of I(X,Z) when a=pq') # plt.show() plt.savefig('Ivspq.png', dpi=200) # print(np.argmin(i), np.max(i)) # Reshape the 2D array i into a 1D array i_flat = i.flatten() # Find the index of the maximum value in the 1D array max_idx = np.argmax(i_flat) # Find the corresponding p and q values using the index max_p_idx, max_q_idx = np.unravel_index(max_idx, i.shape) max_p = p[max_p_idx, max_q_idx] max_q = q[max_p_idx, max_q_idx] print("Maximum I(X,Z) value:", i_flat[max_idx]) print("Corresponding p value:", max_p) print("Corresponding q value:", max_q)
完整绘图代码见 hw1-Cvsq.py
文件。从图中可以看到:攻击信道容量 C 随 q 的增大呈现先减小后增大的趋势,即攻击信道容量 C 是一个凹函数。在 q = 0.5 附近时,攻击信道容量 C 达到最小值 0.069。
完整绘图代码见 hw1-Ivspq.py
文件。从图中可以看到:
import numpy as np import matplotlib.pyplot as plt a_range = np.arange(0.01, 1.00, 0.001) p_range = np.arange(0.01, 1.00, 0.001) q_range = np.arange(0.02, 0.99, 0.001) # Meshgrid for 2D array creation a, p = np.meshgrid(a_range, p_range) # Compute mutual information def get_i(a, p ,q): c1 = 1 + a - p - q c2 = q - a c3 = p - a c4 = 1 + 2 * a - p - q c5 = p + q - 2 * a i1 = c1 * np.log(c1 / ((1 - p) * c4)) i2 = c2 * np.log(c2 / ((1 - p) * c5)) i3 = a * np.log(a / (p * c4)) i4 = c3 * np.log(c3 / (p * c5)) i = i1 + i2 + i3 + i4 return i # def get_max_i(i): def get_max_i(a, p ,q): i = get_i(a, p ,q) i = np.nan_to_num(i) max_i = np.max(i) # print(max_i) # print(i) return max_i max_i = np.zeros_like(q_range) for i, q in enumerate(q_range): # i = get_i(a, p ,q) max_i[i] = get_max_i(a, p ,q) # Plotting fig = plt.figure() ax = fig.add_subplot() ax.plot(q_range, max_i) # Axis labels ax.set_xlabel('q') ax.set_ylabel('max I(X,Z)') # Title ax.set_title('Image of C = max I(X,Z) vs q') plt.show() # plt.savefig('Cvsq.png', dpi=100) print(q_range[np.argmin(max_i)], np.min(max_i)) print(q_range[np.argmax(max_i)], np.max(max_i))
以下为 q = 0.1 到 q = 0.9 时, 互信息 I(X, Z) 与 p 和 a 的关系。(代码见 hw1-Ivsap.py
)
import numpy as np import matplotlib.pyplot as plt q = 0.1 # Compute mutual information def get_i(a, p ,q): c1 = 1 + a - p - q c2 = q - a c3 = p - a c4 = 1 + 2 * a - p - q c5 = p + q - 2 * a i1 = c1 * np.log(c1 / ((1 - p) * c4)) i2 = c2 * np.log(c2 / ((1 - p) * c5)) i3 = a * np.log(a / (p * c4)) i4 = c3 * np.log(c3 / (p * c5)) i = i1 + i2 + i3 + i4 return i # def get_max_i(i): def get_max_i(a, p ,q): i = get_i(a, p ,q) i = np.nan_to_num(i) max_i = np.max(i) # print(max_i) # print(i) return max_i # while (q <= 0.9): # p_range = np.arange(0, 1, 0.01) # a_range = np.arange(0, q, q/100) # p, a = np.meshgrid(p_range, a_range) # i = get_i(a, p, q) # fig = plt.figure() # ax = fig.add_subplot(projection='3d') # ax.plot_surface(p, a, i, cmap='jet') # string = 'Image of I(X,Z) when q = %.2f' % q # ax.set_zlim3d(zmin=0, zmax=0.5) # ax.set_title(string) # ax.set_xlabel('p') # ax.set_ylabel('a') # ax.set_zlabel('I(X,Z)') # # plt.savefig('q=%.2f.png' % q, dpi=200) # plt.show() # q = q + 0.1 fig, axs = plt.subplots(3, 3, figsize=(15, 15)) for i, ax in enumerate(axs.flatten()): q = i / 10.0 + 0.1 p_range = np.arange(0, 1, 0.001) a_range = np.arange(0, q, q/1000) p, a = np.meshgrid(p_range, a_range) i_val = get_i(a, p, q) ax.axis("off") ax = fig.add_subplot(3, 3, i + 1, projection='3d') string = 'Image of I(X,Z) when q = %.2f' % q ax.plot_surface(p, a, i_val, cmap='jet') ax.set_title(string) ax.set_xlabel('p') ax.set_ylabel('a') ax.set_zlabel('I(X,Z)') ax.set_zlim3d(zmin=0, zmax=0.5) plt.tight_layout() plt.show()
在 q 从 0.1 变到 0.9 时,可以发现:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。