【语音加密】基于logistic混沌语音信号加密解密系统matlab代码

2021/11/21 6:12:03

本文主要是介绍【语音加密】基于logistic混沌语音信号加密解密系统matlab代码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1 简介

语音语音加密原理框图在对语音信号进行预处理、加密解密分析之后,将各个步骤联系起来绘出了语音加密原理框图如下:

加密方法选用混沌加密方案,是基于离散混沌映射的加密系统Logistic(罗切斯特)映射。Logistic 映射被公认为是能体现混沌特点的最简单的离散混沌系统映射,它来源于对人口增长模型的研究,其表达式为:

其中,x(n)、x(n+1)为 Logistic 映射的状态值,μ 为系统参数。

上图绘出了当x在[0,1]之间取值,在[2.8,3.99]之间取值时logistic映射分岔图,当μ=3.569945672 时,进入混沌状态。因此将 Logistic 映射应用于保密通信时,通常将初始状态值和参数 μ 作为密钥。

混沌加密方案的具体流程

在伪混沌位序列产生方法上,采取不同μ值、不同初始状态值的两个不同 Logistic 混沌映射进行迭代,先让它们分别初始迭代m、n次(m≠n),再同时迭代,通过动态比较两个映射每次迭代的状态值,产生二进制伪混沌序列。具体算法是:

①在区间[3.57,4]中,选择两个不同的μ值,分别作为两个映射参数;

②在区间[0,1]中,选择两个不同的实数,分别作为两个映射迭代的初始状态值;

③在区间[50,100]中,选择两个不同的整数mn,分别作为两个映射的初始迭代次数。两个映射先分别迭代mn次,得到两个状态值xmyn,然后再开始同时迭代,每次

迭代后,比较两个映射的状态值。如果两个映射分别表示为f1f2,如果 f1(xm)> f2(yn),产生二进制位‘1’;否则,产生二进制位‘0’。如此类推,形成伪混沌二进制位序列;

④读入明文信息,对每一个明文信息位,依据第③步算法,将两个映射迭代,比较每次迭代后的状态值,产生二进制位 0 或 1,并与明文信息位进行模 2 加运算,实现加密。该操作一直持续到将所有明文信息位加密完为止

由于μ、初始状态值、初始迭代次数皆可选择,因此,即使在明文信息中出现的重复字符,加密后也会产生不同的密文。不同的μ值、不同的初始状态值以及不同的初始迭代次数的组合大大地减少了周期窗口出现的几率,提升了伪混沌二进制位序列的不可预测性,在扩大密钥空间的同时,提高了算法的安全性。

为了进一步提高保密性能,本方案可让用户每次通信前自行设置密码,方案依据特定的算法,根据密码生成μ值、初始状态值以及初始迭代次数值,达到“一次一密”的效果。

解密方案:

本课题即采用对称密码体制进行解密,在已设计出的混沌logistic映射加密钥的基础上,解密时只需将加密钥与密文流异或即可恢复明文序列,也就完成了对语音信号的解密过程。

2 部分代码

clear all
clc

fs=44100;                    %语音信号采样频率44100
x=audioread('s.wav');
t=(0:length(x)-1)/44100;

Y=fft(x);          
N=length(Y);
f=fs*(0:N/2-1)/N;
figure(1)
subplot(2,1,1);
plot(t,x)                  %做原始语音信号的时域图形
grid on;  axis tight;
title('原始语音信号');
xlabel('time(s)');
ylabel('幅度');

subplot(2,1,2);
plot(f,abs(Y(1:length(f))))               %做原始语音信号的FFT频谱图
grid on;  axis tight;
title('原始语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%sound(x)
%预处理语音信号(原始信号扩大1000倍)
x1=ceil(1000*x);
Y1=fft(x1);

figure(2)
subplot(2,1,1);
plot(t,x1)                  %预处理语音信号的时域图形
grid on;  axis tight;
title('预处理语音信号');
xlabel('time(s)');
ylabel('幅度');

subplot(2,1,2);
plot(f,abs(Y1(1:length(f))))        %预处理语音信号的FFT频谱图
grid on;  axis tight;
title('预处理语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%sound(x1)

            
Y4=fft(x4);


figure(3)
subplot(2,1,1);
plot(t,x4)                  %加密语音信号的时域图形
grid on;  axis tight;
title('加密语音信号');
xlabel('time(s)');
ylabel('幅度');

subplot(2,1,2);
plot(f,abs(Y4(1:length(f))))        %加密语音信号的FFT频谱图
grid on;  axis tight;
title('加密语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');


%sound(x4)

%输入密码,与密文做异或解出明文
k11=0.3;u11=3.7;k22=0.6;u22=3.9;   %设置初始值,   即密匙
z1=k11;z2=k22;

for m=1:80                     %迭代80次,达到充分混沌状态
   z1=u11*z1*(1-z1);
end
for n=1:90                     %迭代90次,达到充分混沌状态 
   z2=u22*z2*(1-z2);
end
a(1)=z1;
b(1)=z2;

%产生一维混沌解密序列
for i=1:length(x)-1                
   a(i+1)=u11*a(i)*(1-a(i));
   b(i+1)=u22*b(i)*(1-b(i));
end

   AA=zeros(length(x),1);
   
for j=1:length(x)
       if(a(j)>b(j))
           k=1;
       else
           k=0;
       end
       AA(j)=k;  
end
BB=dec_to_bin(AA);     

x5=dec_to_bin(x4);                         %将加密语音十进制转二进制
x6=bitxor((bin2dec(x5)),(bin2dec(BB)));    %再次异或操作解密,得到明文
x7=bin_to_dec(cellstr(dec2bin(x6)))/1000; 

Y7=fft(x7);

figure(4)
subplot(2,1,1);
plot(t,x7)                   %解码语音信号的时域图形
grid on;  axis tight;
title('解码语音信号');
xlabel('time(s)');
ylabel('幅度');

subplot(2,1,2);
plot(f,abs(Y7(1:length(f))))        %解码语音信号的FFT频谱图
grid on;  axis tight;
title('解码语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');

%sound(x)                   %原始语音信号试听
%sound(x1)                   %预处理语音信号试听
%sound(x4)                   %加密语音信号试听
%sound(x6)                   %解密语音信号试听

3 仿真结果

4 参考文献

[1]王虹, 丁源源, 杨杰, & 阙大顺. (2004). 基于小波域logistic混沌调制的数字语音保密通信系统. 武汉理工大学学报:交通科学与工程版, 28(1), 4.



这篇关于【语音加密】基于logistic混沌语音信号加密解密系统matlab代码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程