合肥工业大学密码学课程设计-图像加密

合肥工业大学密码学课程设计

题目

第十二题 图像加密
利用matlab实现

设计要求

系统功能要求:
1)针对图像的特点,实现多种图像加密方法(含图像置乱方法)
2)分析加密算法的性能

系统设计简介

对于图像的加密,我们通常有置乱,值变换,以及我进行设计的一种对于RGB图片进行单位像素的放缩变换。而对于置换算法来说,又包括简单的行变换、列变换、将图像分块之后每个块进行行列变换以及对每个像素点进行随机置乱。我的算法选择为后者,利用生成的随机序列进行置乱。而值变换一般是根据图像的大小、用户自己输入的密钥、选定的迭代次数,根据选定的混沌序列生成算法生成混沌序列,对要加密的图片进行单个像素值得异或操作即完成加密。而对于RGB图片,除了值加密之外,我还选择了另外一种加密方法,即对RGB在每一层分量得像素值进行放缩加密,该加密在视觉上也是有效果的,但是经过攻击检测以及信息熵分析,发现其效果并不是很好。
对于分析加密算法的性能,一般有相邻像素相关性分析、加密质量(EQ)分析、加密图片的统计直方图分析、信息熵分析等,我选择对加密图片的直方图进行分析以及分析加密图片的信息熵。并进行噪声攻击、分析加密图片的鲁棒性。

部分源码

部分源码

function varargout = ChaosEncrypt(varargin)

% Last Modified by GUIDE v2.5 04-Jul-2021 15:45:02

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @ChaosEncrypt_OpeningFcn, ...
                   'gui_OutputFcn',  @ChaosEncrypt_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before ChaosEncrypt is made visible.
function ChaosEncrypt_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for ChaosEncrypt
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes ChaosEncrypt wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = ChaosEncrypt_OutputFcn(hObject, eventdata, handles) 
% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on selection change in popupmenu5.
function popupmenu5_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function popupmenu5_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function popupmenu6_Callback(hObject, eventdata, handles)

function popupmenu6_CreateFcn(hObject, eventdata, handles)

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function scramble_num_edit_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function scramble_num_edit_CreateFcn(hObject, eventdata, handles)

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function Valtrans_num_edit_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function Valtrans_num_edit_CreateFcn(hObject, eventdata, handles)

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function SecretKey_edit_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function SecretKey_edit_CreateFcn(hObject, eventdata, handles)
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in RGBEncrypt_button.
function Encrypt_button_Callback(hObject, eventdata, handles)
pv1=get(handles.popupmenu5,'value');%获取选项框的值 置乱框
handles.P1=pv1;
pv2=get(handles.popupmenu6,'value');%获取选项框的值 置乱框
handles.P2=pv2;
if pv1==1&&pv2==1
    set(handles.edit10,'string','未选择加密方法,不进行加密');
    return;
end
%载入图像
Origin_pic=handles.Originpic;           %读取图像信息
[a b c]=size(Origin_pic);           %将图像的大小赋给a b c 

%获取参数
str=get(handles.SecretKey_edit,'string');%获取密匙
key=str2double(str);%将密匙转为double数字
m(1)=key;%将密匙加入迭代序列
%获取预先迭代次数
Scramble_num=str2double(get(handles.scramble_num_edit,'string'));%scramble_num_edit  迭代次数 用来生成第一位密钥
Valtrans_num=str2double(get(handles.Valtrans_num_edit,'string'));%
%迭代生成第一位密钥 而混沌序列由第一位密钥以及混沌序列递归算法生成
%加密
%置乱
set(handles.edit10,'string','置乱加密中...');%显示提示信息
%针对不同混沌系统加密
%1.Logistic
if pv1==1
    set(handles.edit10,'string','不进行置乱加密');
elseif pv1==2
    Logistic_mu=random('unif',3.968,3.999);%随机参数设置
    handles.Logistic_S=Logistic_mu;
    for i=1:Scramble_num              %预先迭代
     m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
    end
    for i=1:a*b-1                   %生成Logistic随机数列
    m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;         
    end
%2.Tent
elseif pv1==3
        Tent_mu=random('unif',0.42,1);%参数设置
        handles.Tent_S=Tent_mu;
        for i=1:Scramble_num             %预先迭代
            m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
        end
        for i=1:a*b-1                  %tent加密 生成随机序列
            m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
        end
%3.Kent
elseif pv1==4
        Kent_mu=random('unif',0.24,0.49);%参数设置
        handles.Kent_S=Kent_mu;
        for i=1:Scramble_num              %预先迭代
            if m(1)<=Kent_mu;
                m(1)=m(1)/Kent_mu;
            else
                m(1)=(1-m(1))/(1-Kent_mu);
            end
        end
        for i=1:a*b-1;                %kent加密 生成随机序列
            if m(i)<=Kent_mu;
                m(i+1)=m(i)/Kent_mu;
            else
                m(i+1)=(1-m(i))/(1-Kent_mu);
            end
        end
%4.Henon
elseif pv1==5
        xx=m(1);y=random('unif',0.156,0.1614);%参数设置
        Henon_mu1=random('unif',1.330,1.428);
        Henon_mu2=random('unif',0.213,0.260);
        handles.Henon_S=[y,Henon_mu1,Henon_mu2];
        for i=1:Scramble_num;                 % 预先迭代
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(1)=xx;
        end
        for i=2:a*b;                       % Henon加密
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(i)=xx;
        end
end
%利用序列进行置乱
if pv1~=1
    [~,sort_num]=sort(m);%将产生的混沌序列进行排序
    Scramble_pic=uint8(zeros(a,b));%产生一个与原图大小相同的0矩阵
    for i=1:a*b
    Scramble_pic(i)=Origin_pic(sort_num(i));
    end
    set(handles.edit10,'string','置乱成功');
    handles.Scramblepic=Scramble_pic;%一定记得存储句柄 
    axes(handles.axes1);
    imshow(Scramble_pic);
    axes(handles.axes2);
    imhist(Scramble_pic);
    guidata(hObject, handles);
end
%值变换
set(handles.edit10,'string','值变换加密中...');%显示提示信息
m(1)=str2double(str);%将密匙加入迭代序列

%************接下来进行值变换*******************

Origin_pic=handles.Originpic;           %读取图像信息
[a b c]=size(Origin_pic);           %将图像的大小赋给a b c 
%针对不同混沌系统加密
if pv2==1
    set(handles.edit10,'string','不进行值变换.....');
%1.Logistic
elseif pv2==2
    Logistic_mu=random('unif',3.968,3.999);%随机参数设置
    handles.Logistic_V=Logistic_mu;
 for i=1:Valtrans_num              %预先迭代
     m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
 end
 for i=1:a*b*c-1                   %生成Logistic随机数列       
    m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;         
 end
%2.Tent
elseif pv2==3
    Tent_mu=random('unif',0.42,1);%参数设置
    handles.Tent_V=Tent_mu;
for i=1:Valtrans_num             %预先迭代
      m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
end    
for i=1:a*b*c-1                  %tent加密
      m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
end
%3.Kent
elseif pv2==4
Kent_mu=random('unif',0.24,0.49);%参数设置
handles.Kent_V=Kent_mu;
for i=1:Valtrans_num              %预先迭代
             if m(1)<=Kent_mu;
                m(1)=m(1)/Kent_mu;
             else
                m(1)=(1-m(1))/(1-Kent_mu);
             end
end
for i=1:a*b*c-1;                %kent加密
             if m(i)<=Kent_mu;
                m(i+1)=m(i)/Kent_mu;
             else
                m(i+1)=(1-m(i))/(1-Kent_mu);
             end
end
%4.Henon
elseif pv2==5
    xx=m(1);y=random('unif',0.156,0.1614);%参数设置
    Henon_mu1=random('unif',1.330,1.428);
    Henon_mu2=random('unif',0.213,0.260);    
    handles.Henon_V=[y,Henon_mu1,Henon_mu2];
    for i=1:Valtrans_num;                       % 预先迭代
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(1)=xx;
     end   
    for i=2:a*b*c;                       % Henon加密
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(i)=xx;
    end 
end
%利用混沌序列值变换
if pv1==1&&pv2~=1%将原图像进行值变换
    m=mod(1000*m,256);              %1000*m除以256的余数
    m=uint8(m);                     %强制转换为无符号整型
    n=1;                            %定义变量n 
    for i=1:a
        for j=1:b
            for k=1:c
            Valtrans_pic(i,j,k)=bitxor(m(n),Origin_pic(i,j,k));  %将图像信息藏在e(i,j)矩阵中进行异或运算
            n=n+1;
            end
        end
    end
    set(handles.edit10,'string','值变换成功');
    handles.Valtranspic=Valtrans_pic;%更新句柄
    axes(handles.axes1);
    imshow(Valtrans_pic);
    axes(handles.axes2);
    imhist(Valtrans_pic);
    guidata(hObject, handles);
elseif pv1~=1&&pv2~=1%对置乱变换后的图像再进行值变换
        m=mod(1000*m,256);              %1000*m除以256的余数
    m=uint8(m);                     %强制转换为无符号整型
    n=1;                            %定义变量n 
    for i=1:a
        for j=1:b
            for k=1:c
            Valtrans_pic(i,j,k)=bitxor(m(n),Scramble_pic(i,j,k));  %将图像信息藏在e(i,j)矩阵中进行异或运算
            n=n+1;
            end
        end
    end
    set(handles.edit10,'string','值变换成功');
    handles.Valtranspic=Valtrans_pic;%更新句柄 两者都采用了
    axes(handles.axes1);
    imshow(Valtrans_pic);
    axes(handles.axes2);
    imhist(Valtrans_pic);
    guidata(hObject, handles);
end

% --- Executes on button press in Decrypt_button.
function Decrypt_button_Callback(hObject, eventdata, handles)
%先确定用了哪种方法
pv1=get(handles.popupmenu5,'value');
handles.P1=pv1;
pv2=get(handles.popupmenu6,'value');
handles.P2=pv2;
%载入图像
%********************先通过合适的方法读入正确的图像************************
if pv1~=1
    if pv2==1
        x=handles.Scramblepic;%采用了置乱变换未采用值变换
        [a b c]=size(x);             %将图像的大小赋给a b c 
    else%两者都采用了
        x=handles.Valtranspic; %采用了值加密跟变换加密
        [a b c]=size(x);             %将图像的大小赋给a b c 
    end
else%未采用置换加密
    if pv2~=1%未采用置换解密采用了值加密
        x=handles.Valtranspic;%未采用了置乱变换采用值变换
        [a b c]=size(x);             %将图像的大小赋给a b c 
    else
        set(handles.edit10,'string','图像未进行加密');
        return;
    end
end
%获取参数
str=get(handles.SecretKey_edit,'string');%获取密匙
key=str2double(str);%将密匙转为double数字
m(1)=key;%将密匙加入迭代序列
%获取预先迭代次数
Scramble_num=str2double(get(handles.scramble_num_edit,'string'));
Valtrans_num=str2double(get(handles.Valtrans_num_edit,'string'));
%解密
%先进行值变换解密
%值变换
if pv2==1
    set(handles.edit10,'string','图像未进行值变换加密...');
%针对不同混沌系统加密
%1.Logistic
elseif pv2==2
    Logistic_mu=handles.Logistic_V;   %获取参数
    for i=1:Valtrans_num              %预先迭代
        m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
    end
    for i=1:a*b*c-1                   %生成Logistic随机数列
        m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;
    end
%2.Tent
elseif pv2==3
    Tent_mu=handles.Tent_V;        %获取参数
    for i=1:Valtrans_num             %预先迭代
        m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
    end
    for i=1:a*b*c-1                  %tent加密
        m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
    end
%3.Kent
elseif pv2==4
    Kent_mu=handles.Kent_V;             %获取参数
    for i=1:Valtrans_num              %预先迭代
        if m(1)<=Kent_mu
            m(1)=m(1)/Kent_mu;
        else
            m(1)=(1-m(1))/(1-Kent_mu);
        end
    end
    for i=1:a*b*c-1                %kent加密
        if m(i)<=Kent_mu
            m(i+1)=m(i)/Kent_mu;
        else
            m(i+1)=(1-m(i))/(1-Kent_mu);
        end
    end
%4.Henon
elseif pv2==5
    xx=m(1);  
    [y,Henon_mu1,Henon_mu2]=handles.Henon_V;   %获取参数
    for i=1:Valtrans_num                       % 预先迭代
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(1)=xx;
     end   
    for i=2:a*b*c                       % Henon加密
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(i)=xx;
    end 
end
if pv2~=1
    %利用混沌序列值变换
    m=mod(1000*m,256);              %1000*m除以256的余数
    mtmp=uint8(m);                     %强制转换为无符号整型
    n=1;                            %定义变量n 
    for i=1:a
        for j=1:b
            for k=1:c
                DeValtrans_pic(i,j,k)=bitxor(mtmp(n),x(i,j,k));  %将图像信息藏在e(i,j)矩阵中进行异或运算
                n=n+1;
            end
        end
    end
    set(handles.edit10,'string','值变换解密成功');
    handles.Valtranspic=DeValtrans_pic;%此处句柄被更新了 此处句柄代表置乱解密后的图像
    axes(handles.axes1);
    imshow(DeValtrans_pic);
    axes(handles.axes2);
    imhist(DeValtrans_pic);
    guidata(hObject, handles);
end
%*****************接下来进行置乱解密***************************
m(1)=str2double(str);%将密匙加入迭代序列
if pv1==1
    set(handles.edit10,'string','图像未进行置乱变换加密...');
    %置乱
    return;
%针对不同混沌系统加密
%1.Logistic
elseif pv1==2
    Logistic_mu=handles.Logistic_S;%获取参数
    for i=1:Scramble_num              %预先迭代
        m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
    end
    for i=1:a*b-1                   %生成Logistic随机数列
        m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;
    end
%2.Tent
elseif pv1==3
    Tent_mu=handles.Tent_S;      %获取参数
    for i=1:Scramble_num           %预先迭代
        m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
    end    
for i=1:a*b-1                  %tent加密
      m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
end
%3.Kent
elseif pv1==4
    Kent_mu=handles.Kent_S;            %获取参数
    for i=1:Scramble_num              %预先迭代
        if m(1)<=Kent_mu
            m(1)=m(1)/Kent_mu;
        else
            m(1)=(1-m(1))/(1-Kent_mu);
        end
    end
    for i=1:a*b-1                %kent加密
        if m(i)<=Kent_mu
            m(i+1)=m(i)/Kent_mu;
        else
            m(i+1)=(1-m(i))/(1-Kent_mu);
        end
end
%4.Henon
elseif pv1==5
    xx=m(1);    
    [y,Henon_mu1,Henon_mu2]=handles.Henon_S;%获取参数
    for i=1:Scramble_num                 % 预先迭代
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(1)=xx;
     end   
    for i=2:a*b                       % Henon加密
          xm=xx;
          ym=y;
          xx=ym+1-Henon_mu1*xm.*xm;
          y=Henon_mu2*xm;
          m(i)=xx;
    end 
end


if pv2==1&&pv1~=1%没有进行值变换 但是进行了置乱变换 此时不会产生DeValtrans_pic 需要用原图x
    [~,sort_num]=sort(m);%将产生的混沌序列进行排序
    DeScramble_pic=uint8(zeros(a,b));%产生一个与原图大小相同的0矩阵
    for i=1:a*b
        DeScramble_pic(sort_num(i))=x(i);%原图的图像 进行置乱 利用混沌序列
    end
    set(handles.edit10,'string','置乱解密成功');
    handles.Decryptpic=DeScramble_pic;
    axes(handles.axes1);
    imshow(DeScramble_pic);
    axes(handles.axes2);
    imhist(DeScramble_pic);
    guidata(hObject, handles);
else %两者都进行了 先从上面读出来经过了值解密的图片
    %值解密之后的图片存在句柄Valtranspic里面
   [~,sort_num]=sort(m);%将产生的混沌序列进行排序
    DeScramble_pic=uint8(zeros(a,b));%产生一个与原图大小相同的0矩阵
    for i=1:a*b
    DeScramble_pic(sort_num(i))=DeValtrans_pic(i);
    end
    set(handles.edit10,'string','置乱解密成功');
    handles.Decryptpic=DeScramble_pic;
    handles.Scramblepic=DeScramble_pic;%解密成功后的图像
    axes(handles.axes1);
    imshow(DeScramble_pic);
    axes(handles.axes2);
    imhist(DeScramble_pic);
    guidata(hObject, handles);
end

function edit5_Callback(hObject, eventdata, handles)



% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in Originpic_button.
function Originpic_button_Callback(hObject, eventdata, handles)

axes(handles.axes1);
imshow(handles.Originpic);
axes(handles.axes2);
imhist(handles.Originpic);

% --- Executes on button press in Valtranspic_button.
function Valtranspic_button_Callback(hObject, eventdata, handles)
axes(handles.axes1);
imshow(handles.Valtranspic);
axes(handles.axes2);
imhist(handles.Valtranspic);

% --- Executes on button press in Scramblepic_button.
function Scramblepic_button_Callback(hObject, eventdata, handles)
axes(handles.axes1);
imshow(handles.Scramblepic);
axes(handles.axes2);
imhist(handles.Scramblepic);
% --- Executes on button press in Save_button.
function Save_button_Callback(hObject, eventdata, handles)
[f,p]=uiputfile({'*.bmp'},'保存文件');
str=strcat(p,f);
pix=getframe(handles.axes1);
imwrite(pix.cdata,str,'bmp')


% --- Executes on button press in CreateKey.
function CreateKey_Callback(hObject, eventdata, handles)

e=rand(1);
set(handles.SecretKey_edit,'String',num2str(e));%显示随机生成的密钥 0-1
handles.SecretKey = e; 
guidata(hObject, handles);%储存handles

% --- Executes on button press in Openpic_button.
function Openpic_button_Callback(hObject, eventdata, handles)

[filename1,filedir1]=uigetfile('*.bmp','选择图片');    % 弹出打开对话框
filename2=strcat(filedir1,filename1);       % 存储路径
%set(handles.lujin,'String',filename2);     % 显示路
Image0 = imread(filename2);    % 获取原始图
axes(handles.axes1);
imshow(Image0);
axes(handles.axes2);
imhist(Image0);
handles.Originpic = Image0;
guidata(hObject, handles);


% --- Executes during object creation, after setting all properties.
function axes1_CreateFcn(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function axes2_CreateFcn(hObject, eventdata, handles)

function text5_ButtonDownFcn(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function CreateKey_CreateFcn(hObject, eventdata, handles)



% --- Executes on button press in RGBDecrypt_button.
function RGBDecrypt_button_Callback(hObject, eventdata, handles)



% --- Executes on button press in pushbutton13.
function pushbutton13_Callback(hObject, eventdata, handles)


% --- Executes on selection change in RGB_menu.
function RGB_menu_Callback(hObject, eventdata, handles)



% --- Executes during object creation, after setting all properties.
function RGB_menu_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in RGB_encrypt.
function RGB_encrypt_Callback(hObject, eventdata, handles)
Scramble_num=str2double(get(handles.scramble_num_edit,'string'));
Valtrans_num=str2double(get(handles.Valtrans_num_edit,'string'));
str=get(handles.SecretKey_edit,'string');%获取密匙
key=str2double(str);%将密匙转为double数字
m(1)=key;%将密匙加入迭代序列
pv1=get(handles.popupmenu6,'value');%获取选项框的值 值变化框
pv2=get(handles. RGB_menu,'value');%选择RGB的混沌序列值变换或者是进行放缩
handles.P1=pv1;
handles.P2=pv2;
RGB=handles.Originpic;
if pv2==1%进行RGB的混沌序列值变换
    
    [a b c]=size(RGB);           %将图像的大小赋给a b c
    %针对不同混沌系统加密
    if pv1==1
        set(handles.edit10,'string','不进行值变换.....');
        return;
        %1.Logistic
    elseif pv1==2
        Logistic_mu=random('unif',3.968,3.999);%随机参数设置
        handles.Logistic_V=Logistic_mu;
        for i=1:Valtrans_num              %预先迭代
            m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
        end
        for i=1:a*b*c-1                   %生成Logistic随机数列
            m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;
        end
        %2.Tent
    elseif pv1==3
        Tent_mu=random('unif',0.42,1);%参数设置
        handles.Tent_V=Tent_mu;
        for i=1:Valtrans_num             %预先迭代
            m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
        end
        for i=1:a*b*c-1                  %tent加密
            m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
        end
        %3.Kent
    elseif pv1==4
        Kent_mu=random('unif',0.24,0.49);%参数设置
        handles.Kent_V=Kent_mu;
        for i=1:Valtrans_num              %预先迭代
            if m(1)<=Kent_mu;
                m(1)=m(1)/Kent_mu;
            else
                m(1)=(1-m(1))/(1-Kent_mu);
            end
        end
        for i=1:a*b*c-1;                %kent加密
            if m(i)<=Kent_mu;
                m(i+1)=m(i)/Kent_mu;
            else
                m(i+1)=(1-m(i))/(1-Kent_mu);
            end
        end
        %4.Henon
    elseif pv1==5
        xx=m(1);y=random('unif',0.156,0.1614);%参数设置
        Henon_mu1=random('unif',1.330,1.428);
        Henon_mu2=random('unif',0.213,0.260);
        handles.Henon_V=[y,Henon_mu1,Henon_mu2];
        for i=1:Valtrans_num;                       % 预先迭代
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(1)=xx;
        end
        for i=2:a*b*c;                       % Henon加密
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(i)=xx;
        end
    end
    %利用混沌序列值变换
    m=mod(1000*m,256);              %1000*m除以256的余数
    m=uint8(m);                     %强制转换为无符号整型
    n=1;                            %定义变量n
    for i=1:a
        for j=1:b
            for k=1:c
                Valtrans_pic(i,j,k)=bitxor(m(n),RGB(i,j,k));  %将图像信息藏在e(i,j)矩阵中进行异或运算
                n=n+1;
            end
        end
    end
    set(handles.edit10,'string','值变换成功');
    handles.Valtranspic=Valtrans_pic;%更新句柄
    handles.RGBpic=Valtrans_pic;
    axes(handles.axes1);
    imshow(Valtrans_pic);
    axes(handles.axes2);
    imhist(Valtrans_pic);
    guidata(hObject, handles);
else%进行RGB的放缩
    s = size(RGB);
    r = rand(s(1), s(2), s(3)) * 10; 
    handles.scale = r;
    guidata(hObject, handles);%储存handles
    %产生0-10之内的随机数 三维 改变这里的矩阵中每个元素的大小
    %对于RGB图像中的每个像素点也就改变的越多 最后加密的图像也就越不清晰
    RGBD = im2double(RGB);%归一化到0-1之间
    RGBS = RGBD .* r;%对应位置逐个相乘
    handles.Valtranspic = RGBS;
    handles.RGBpic=RGBS;
    axes(handles.axes1);
    imshow(RGBS);
    axes(handles.axes2);
    imhist(RGBS);
    guidata(hObject, handles);
end
% --- Executes on button press in pushbutton13.
function RGB_decrypt_Callback(hObject, eventdata, handles)
str=get(handles.SecretKey_edit,'string');%获取密匙
key=str2double(str);%将密匙转为double数字
m(1)=key;%将密匙加入迭代序列
%获取预先迭代次数
Scramble_num=str2double(get(handles.scramble_num_edit,'string'));
Valtrans_num=str2double(get(handles.Valtrans_num_edit,'string'));
pv1=get(handles.popupmenu6,'value');%获取选项框的值 值变化框
pv2=get(handles. RGB_menu,'value');%选择RGB的混沌序列值变换或者是进行放缩
x=handles.Valtranspic;%读取图片
[a b c]=size(x);
if pv2==1
    set(handles.edit10,'string','接下来对图像进行值解密...');
    if pv1==1
        set(handles.edit10,'string','图像未进行值变换加密...');
        %针对不同混沌系统加密
        %1.Logistic
    elseif pv1==2
        Logistic_mu=handles.Logistic_V;   %获取参数
        for i=1:Valtrans_num              %预先迭代
            m(1)= Logistic_mu*m(1)- Logistic_mu*m(1)^2;
        end
        for i=1:a*b*c-1                   %生成Logistic随机数列
            m(i+1)= Logistic_mu*m(i)- Logistic_mu*m(i)^2;
        end
        %2.Tent
    elseif pv1==3
        Tent_mu=handles.Tent_V;        %获取参数
        for i=1:Valtrans_num             %预先迭代
            m(1)=Tent_mu-(1+Tent_mu)*abs(m(1));
        end
        for i=1:a*b*c-1                  %tent加密
            m(i+1)=Tent_mu-(1+Tent_mu)*abs(m(i));
        end
        %3.Kent
    elseif pv1==4
        Kent_mu=handles.Kent_V;             %获取参数
        for i=1:Valtrans_num              %预先迭代
            if m(1)<=Kent_mu
                m(1)=m(1)/Kent_mu;
            else
                m(1)=(1-m(1))/(1-Kent_mu);
            end
        end
        for i=1:a*b*c-1                %kent加密
            if m(i)<=Kent_mu
                m(i+1)=m(i)/Kent_mu;
            else
                m(i+1)=(1-m(i))/(1-Kent_mu);
            end
        end
        %4.Henon
    elseif pv1==5
        xx=m(1);
        [y,Henon_mu1,Henon_mu2]=handles.Henon_V;   %获取参数
        for i=1:Valtrans_num                       % 预先迭代
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(1)=xx;
        end
        for i=2:a*b*c                       % Henon加密
            xm=xx;
            ym=y;
            xx=ym+1-Henon_mu1*xm.*xm;
            y=Henon_mu2*xm;
            m(i)=xx;
        end
    end
    %利用混沌序列值变换
    m=mod(1000*m,256);              %1000*m除以256的余数
    mtmp=uint8(m);                     %强制转换为无符号整型
    n=1;                            %定义变量n
    for i=1:a
        for j=1:b
            for k=1:c
                DeValtrans_pic(i,j,k)=bitxor(mtmp(n),x(i,j,k));  %将图像信息藏在e(i,j)矩阵中进行异或运算
                n=n+1;
            end
        end
    end
    set(handles.edit10,'string','值变换解密成功');
    handles.Scramblepic=DeValtrans_pic;%此处句柄被更新了 此处句柄代表置乱解密后的图像
    axes(handles.axes1);
    imshow(DeValtrans_pic);
    axes(handles.axes2);
    imhist(DeValtrans_pic);
    guidata(hObject, handles);
elseif pv2==2
    set(handles.edit10,'string','接下来对图像进行放缩解密...');
    r1=handles.scale;%读取放缩系数
    x1=im2double(handles.RGBpic);
    DeValtrans_pic= x1 ./ r1;%对应位置逐个相除
    handles.Valtranspic=DeValtrans_pic;%此处句柄被更新了 此处句柄代表置乱解密后的图像
    axes(handles.axes1);
    imshow(DeValtrans_pic);
    guidata(hObject, handles);
end
function entropy_R_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function entropy_R_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in entropy_cal.
function entropy_cal_Callback(hObject, eventdata, handles)
set(handles.entropy_R,'String','');
set(handles.entropy_G,'String','');
set(handles.entropy_B,'String','');
pv4=get(handles.popupmenu8,'value');%获取选项框的值 值变化框
if pv4==1
    I=handles.Originpic;
elseif pv4==2%置乱图像的信息熵
    I=handles.Scramblepic;
elseif pv4==3
    I=handles.Valtranspic;%值变化的信息熵
elseif pv4==4
    I=round(handles.RGBpic);
end
[a,b,c]=size(I);
if c==1
    %disp('这是一幅灰度图,接下来将计算灰度图像的信息熵');
    set(handles.edit10,'string','这是一幅灰度图,接下来将计算灰度图像的信息熵');
    [C,L]=size(I); %求图像的规格
    Img_size=C*L; %图像像素点的总个数
    G=256; %图像的灰度级
    H_x=0;
    nk=zeros(G,1);%产生一个G1列的全零矩阵
    for i=1:C
        for j=1:L
            Img_level=I(i,j)+1; %获取图像的灰度级
            nk(Img_level)=nk(Img_level)+1; %统计每个灰度级像素的点数
        end
    end
    for k=1:G  %循环
        Ps(k)=nk(k)/Img_size; %计算每一个像素点的概率
        if Ps(k)~=0; %如果像素点的概率不为零
            H_x=-Ps(k)*log2(Ps(k))+H_x; %求熵值的公式
        end
    end
    handles.HR=H_x;
    set(handles.entropy_R,'String',num2str(H_x));
    guidata(hObject, handles);
elseif c~=1
        %disp('这是一幅彩色图像,接下来分通道计算信息熵');
        set(handles.edit10,'string','这是一幅彩色图像,接下来分通道计算信息熵');
        for s=1:3
            image=I(:,:,s);
            [C,L]=size(image); %求图像的规格
            Img_size=C*L; %图像像素点的总个数
            G=256; %图像的灰度级
            H_x=0;
            nk=zeros(G,1);%产生一个G1列的全零矩阵
            for i=1:C
                for j=1:L
                    Img_level=image(i,j)+1; %获取图像的灰度级
                    nk(Img_level)=nk(Img_level)+1; %统计每个灰度级像素的点数
                end
            end
            for k=1:G  %循环
                Ps(k)=nk(k)/Img_size; %计算每一个像素点的概率
                if Ps(k)~=0; %如果像素点的概率不为零
                    H_x=-Ps(k)*log2(Ps(k))+H_x; %求熵值的公式
                end
            end
            if s==1
                handles.HR=H_x;
                set(handles.entropy_R,'String',num2str(H_x));
                guidata(hObject, handles);
            elseif s==2
                handles.HG=H_x;
                set(handles.entropy_G,'String',num2str(H_x));
                guidata(hObject, handles);
            else
                handles.HB=H_x;
                set(handles.entropy_B,'String',num2str(H_x));
                guidata(hObject, handles);
            end
        end
end


% --- Executes on button press in attack_salt.
function attack_salt_Callback(hObject, eventdata, handles)
pv1=get(handles.popupmenu5,'value');%运用了置乱加密没有用到值加密 图片存储在句柄S中
pv2=get(handles.popupmenu6,'value');%只要用到了值加密 图片就存在句柄V中
pv3=get(handles.RGB_menu,'value');
if pv1==1%没采用置乱
    if pv2==1
        set(handles.edit10,'string','将对原图进行攻击');
        image=handles.Originpic;
    elseif pv2~=1
        image=handles.Valtranspic;
    end
else
   image=handles.Scramblepic; 
end
if pv3==2
    image=handles.RGBpic
    lamda=get(handles.attack_kind,'string');
    attack_image = imnoise(image,'salt & pepper',str2double(lamda));
    handles.attackimage=attack_image;
    handles.RGBpic=attack_image;
%     handles.Scramblepic=attack_image;
%     handles.Valtranspic=attack_image;
    axes(handles.axes4);
    imshow(attack_image);
    guidata(hObject, handles);

end
lamda=get(handles.attack_kind,'string');
attack_image = imnoise(image,'salt & pepper',str2double(lamda));
handles.attackimage=attack_image;
handles.Scramblepic=attack_image;
handles.Valtranspic=attack_image;
axes(handles.axes4);
imshow(attack_image);
guidata(hObject, handles);

% --- Executes on button press in attack_2.
function attack_2_Callback(hObject, eventdata, handles)
%用方程g=f+n*f将乘性噪声添加到图像f上,其中n是均值为0,方差为var的均匀分布的随机噪声,var的默认值是0.04。
pv1=get(handles.popupmenu5,'value');%运用了置乱加密没有用到值加密 图片存储在句柄S中
pv2=get(handles.popupmenu6,'value');%只要用到了值加密 图片就存在句柄V中
pv3=get(handles.RGB_menu,'value');
if pv1==1%没采用置乱
    if pv2==1
        set(handles.edit10,'string','将对原图进行攻击');
        image=handles.Originpic;
    elseif pv2~=1
        image=handles.Valtranspic;
    end
else
    image=handles.Scramblepic;
end
if pv3==2
    image=handles.RGBpic
    lamda=get(handles.attack_kind,'string');
    attack_image = imnoise(image,'salt & pepper',str2double(lamda));
    handles.attackimage=attack_image;
    handles.RGBpic=attack_image;
%     handles.Scramblepic=attack_image;
%     handles.Valtranspic=attack_image;
    axes(handles.axes4);
    imshow(attack_image);
    guidata(hObject, handles);   
end
image=handles.Valtranspic;
lamda=get(handles.attack_kind,'string');
attack_image = imnoise(image,'speckle',str2double(lamda));
handles.attackimage=attack_image;
handles.Scramblepic=attack_image;
handles.Valtranspic=attack_image;
axes(handles.axes4);
imshow(attack_image);
guidata(hObject, handles);

function attack_kind_CreateFcn(hObject, eventdata, handles)
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in RGB_pic.
function RGB_pic_Callback(hObject, eventdata, handles)
axes(handles.axes1);
imshow(handles.RGBpic);
axes(handles.axes2);
imhist(handles.RGBpic);



function entropy_G_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function entropy_G_CreateFcn(hObject, eventdata, handles)

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function entropy_B_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function entropy_B_CreateFcn(hObject, eventdata, handles)

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit10_Callback(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function edit10_CreateFcn(hObject, eventdata, handles)
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in popupmenu8.
function popupmenu8_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu8 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu8


% --- Executes during object creation, after setting all properties.
function popupmenu8_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

写在最后

建议学弟学妹自己独立完成。这里附上我的课程设计报告,仅供参考

链接: 点点这里

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rainist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值