Skip to content

skywind2002/Project2-Encryption

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

83 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README

Project2 安全编码与波形信道传输

0 波形信道传输模型

通网课件 3 数字调制与传输 p49

预计流程图如下(相比于大作业 I,在收发端增加了一个加解密模块和一个载波调制模块)

graph LR
    Origin[信源比特流]
    Dest[信宿比特流]
    Origin-->加密-->conv[卷积码]-->mapping[电平映射]-->filterT[升余弦滤波]-->modulate[载波升频调制]-->channel1[信道]
    channel2[信道]-->demodulate[载波降频提取]-->filterR[升余弦滤波]-->demapping[电平反映射]-->Viterbi[维特比译码]-->解密-->Dest
Loading

1 波形信道传输

在第二次仿真任务基础上,考虑以下波形信道

  • 某数据传输系统,试图利用 300-3400Hz 的双边话音通道进行载波传输,波形信道为加性高斯白噪声信道。
    • $W = \frac{3400-300}{2} = 1550\ \text{Hz}$
    • 进行基带调制后,时域乘 $\cos(2 \pi f_0 t)$ 升频。其中 $f_0 = \frac{3400+300}{2}\ \text{Hz} = 1850\ \text{Hz}$
  • 采用线性传输,收发两端拟采用滚降系数 $0.5$ 的根号升余弦滤波,以解决采样点失真问题。
    • 在 MATLAB 中使用 rcosdesign() 得到根号升余弦滤波器
    • $\alpha = 2 W T_s - 1 = 0.5$ 可以得到 $T_s = \frac{\alpha + 1}{2W}$
    • $R_S = \frac{1}{T_s} \leq \frac{2W}{1 + \alpha} = 2067\ \text{符号/s}$,所需传输速度为 $R_b \geq \frac{8192\ \text{bit}}{5\ \text{s}} = 1638\ \text{bit/s}$
    • 当然实际传输不一定占满所给频带 可以降低$W$的值(但会导致$R_s$下降)

需求

  • 某数据文件大小为 1 kB,希望在5秒钟之内传完 (不是说5秒钟内仿真完,而是说相当于以信道中传输的波形的时间长度不超过5秒)。
    • 即希望 5 s 传输 8192 bit
    • $R_S \leq 2067\ \text{符号/s}$, $R_b \geq 1638\ \text{bit/s}$,故可以使用二元符号映射方式。
    • 加入编码等冗余后需要注意不超过此限制

任务

  • 无编码情况下,自行选择调制方式和参数(进制数、符号率),说明理由
    • MASK MPSK
    • 符号率选择$R_s = \frac{1}{T_s}$ 当然也可以选用更低的符号速率 占用更少的带宽
  • 自行选择合适的采样率刻画信号波形,画出发射波形(细节)和功率谱
    • 采样率选择符号速率的precision_N
  • 按该采样率产生一定功率谱密度 $n_0$ 的AWGN,叠加在一定功率的调制信号上,作为接收机输入,画出叠加噪声的接收信号波形(细节)和功率谱
    • 使用MATLAB的awgn()函数添加噪声 设定信噪比为SNR
  • 编写解调判决模块,统计误比特率与 $E_b/n_0$ 的关系
  • 引入卷积码,自行选择编码参数(效率)和调制参数,说明理由
  • 编写相应的信道编码(含调制),画出发射波形(细节)和功率谱,接收机入口信号波形和功率谱
  • 编写相应的接收机,完成从接收波形到最终信源比特的恢复,统计硬判决和软判决的误比特率与 $E_b/n_0$ 的关系(注意 $E_b$ 是平均传输每个信源比特所需要的接收信号分量的能量)

1.1 选择调制方式和参数

无编码情况下,自行选择调制方式和参数(进制数、符号率),说明理由

MATLAB代码中实现的调制方式有MASKMPSK (M = 2,4,8,16) (ASK.m iASK.m PSK.m iPSK.m),其中ASK映射所需的能量较多,但由于不需要考虑复数的处理,实现较为简单;PSK所需能量较少,同等发射能量的情况下,PSK的误码率理论上比ASK更小。

实验中选择8PSK作为传输的映射方式,选择的原因是较小的进制数难以达到较高的传输速率,较大的进制数可能会提高出错概率。而且实现代码经修改后支持复数转实数的发射与接收。

SK_way = 'PSK';
SK_M = 8;

前面已经讨论过,使用二元映射也是满足题设条件的,这里选择最大的传输速率占满频谱,即 $R_S = 2067\ \text{符号/s}$

1.2 选择采样率刻画波形信号

自行选择合适的采样率刻画信号波形,画出发射波形(细节)和功率谱

采样率选择符号速率的precision_N倍,这里在SNR较高时,precision_N取3已经足够;当SNR提高时,需要适当提高precision_N来提高采样率。

先将随机生成的比特流message使用8PSK映射为符号;

选取precision_N = 16,用冲激串加载符号 刻画“连续”波形得到下图(左侧为实部,右侧为虚部,只取前20个采样点进行示意):

在此基础上,信号过根号升余弦滤波器得到连续波形:

要发送信号我们需要将低频信号升频:

u_t = s_t .* exp(1j * (omega_0 * t));
u_t = real(u_t);

u(t)即为要发送的连续波形,发射波形(细节)和功率谱如下:

1.3 高斯噪声叠加

按该采样率产生一定功率谱密度 $n_0$ 的AWGN,叠加在一定功率的调制信号上,作为接收机输入,画出叠加噪声的接收信号波形(细节)和功率谱

使用MATLAB的awgn()函数添加噪声 设定信噪比为SNR = 20,可以看到频谱上有噪声叠加,波形与未叠加噪声前的波形存在差异。

1.4 统计误比特率

编写解调判决模块,统计误比特率与 $E_b/n_0$ 的关系

这里首先要导出MATLAB函数awgn()的参数SNR$E_b/n_0$ 的关系:

由于使用8PSK,单符号的平均能量为 $E_s = r^2 (r = 1)$,单比特的平均能量 $E_b = \frac{E_s}{3}$,$S = E_b \cdot 8192$

由于传输的信号占满 $300 - 3400 Hz$ 这个频段,$N = n_0 \cdot 3100$

$SNR = 10 \lg{\frac{S}{N}} = 10 \lg{\frac{8192E_b}{3100n_0}}$

main_noRSA_1_4_analysis.m中,选取Ebn0_array = [0.01, 0.1:0.1:5];,计算出SNR后重复实验多次(experiment_times)取平均得到BER_array

subplot(1, 2, 1);
loglog(Ebn0_array, BER_array, "x-"); xlabel("E_b/n_0"); ylabel("BER");
subplot(1, 2, 2);
semilogy(SNR_array, BER_array, "o-"); xlabel("SNR (dB)"); ylabel("BER");

得到如下结果:


1.5 卷积码的参数选择

引入卷积码,自行选择编码参数(效率)和调制参数,说明理由

信道无码间串扰的最大传输速率为 $R_S \leq 2067\ \text{符号/s}$;希望的文件传输速率为$R_b \geq 1638\ \text{bit/s}$

具体选择方式如下:

SK_way = 'PSK'; SK_M = 8;
n = log2(SK_M); k = 1; m = 4;
% 注意这里n=2的话就选QPSK n=3的话就选8PSK 因为软解的话这两个值必须相同
A = cat(3, [1 1 1], [1 0 1], [0 1 1], [1 1 1]);
zero_begin = 1; % 从零状态开始
zero_end = 1; % 收尾

最大传输的比特速率为 $R_{S_{max}} * log2(SK_M) / n$,由于需要使用viterbi软解码,这里 $log2(SK_M)$$n$ 的值是相同的,所以最大的传输比特速率为 $R_B = R_{S_{max}} = 2067\ \text{bit/s}$ 大于所需的传输文件需求。

1.6 信道编码 & 1.7 卷积码接收

编写相应的信道编码(含调制),画出发射波形(细节)和功率谱,接收机入口信号波形和功率谱

编写相应的接收机,完成从接收波形到最终信源比特的恢复

1.1类似,在符号映射前添加卷积码编码:

conv_encoded_message = conv_encode(message, n, k, m, A, zero_begin, zero_end, p);
...
a_n = PSK(conv_encoded_message, SK_M, r);

发射波形和功率谱与前面的没有很大的区别(其中u(t)为升频后实际发送的波形):

接收时则根据硬或软Viterbi选择不同的距离函数和判决方式:

if viterbi_mode == 0 % hard
    distance = @(b, a)(hard_distance(b, a, 2));
    message_rec = iPSK(y_n, SK_M); % 注意 这一步将采样得到的实数接受序列变成了01比特流(对应卷积码编码结束后的conv_encoded_message)
    message_rec = viterbi_decode(message_rec, n, k, m, A, viterbi_mode, p, distance); % 传入的message_rec是01序列

else % soft
    distance = @(z, y)(sum(abs(PSK(y, SK_M, r) - z).^2, 2));
    message_rec = viterbi_decode(y_n, n, k, m, A, viterbi_mode, p, distance); % 注意 这里传入软判的序列是直接采样得到的实序列
    disp(length(message_rec))
end

由于前面使用收尾的方式,最后要去尾零:

message_rec = message_rec(1:length(message));

最终得到的message_rec即为Viterbi解码后的码流

1.7 卷积码接收误比特率统计

统计硬判决和软判决的误比特率与 $E_b/n_0$ 的关系(注意 $E_b$ 是平均传输每个信源比特所需要的接收信号分量的能量)

1.4类似,运行main_noRSA_1_7_analysis.m,修改其中的 viterbi_mode = 0; % 0 hard 1 soft,每个点跑5次取平均,得到下图:

可以看到软解的误比特率约比硬解的小一个量级。

2 安全编码

设计一种加密机制(繁简自便,但要有明确的算法说明):

  • RSA算法:

    前置工作:生成两个大素数p与q,这个RSA的加密算法的核心参数就是$N=pq$。其欧拉函数$\phi(N)=(p-1)(q-1)$。再生成公钥与私钥,一个是大于$p,q$且与$\phi(N)$互质的数e,而另一个是满足$de=1(mod\ \phi(N))$的数字。这两个数一个公开一个保密

    在加密段,对明文进行$c=m^e(mod\ N)$的操作得到密文c

    在解密端,对密文进行$m=c^d(mod\ N)$的操作得到明文m

    核心是生成大素数,我们采用Miller-Rabin素性检验解决。

  • EIGamal算法:

    前置工作:生成一个大素数p(仍然使用Miller-Rabin素性检验),找到GF(p)内的一个本原元g**(实际上p是素数的话本原元随便取一个就行)**。然后取2~p-1之间的任意一个数d我作为私钥,计算$y=g^d(mod\ p)$。y也是公钥的一部分。由于循环域内对数操作的难解性,Eve很难从公钥y,g,p中解密出私钥d。

    在加密段:首先生成加密参数k,然后计算$U=y^k=g^{dk}(mod\ p)$。然后生成两个传输的参数。一个是参照项$c_1=g^k(mod\ p)$,第二个是信息项$c_2=(U\times m)(mod\ p)$。(其中m是明文)。$c1,c2$一起被传输

    在解密段,首先利用$c_1$将加密段生成的加密参数k破译:$V=c_1^d=g^{dk}(mod\ p)$。然后取V的逆作为加密操作U的逆操作,解密只需要$m=c_2\times V^{-1}(mod\ p)$

  • DES算法:

    算法极其复杂,在此只提供流程图(在文件夹里)

安全、信道编码联调:

  • 无加密:观察不同信噪比条件下,误码图案
  • 有加密:观察不同信噪比条件下,误码图案

About

清华大学电子工程系 大三上《编码引论》大作业2——加密与解密

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •