信息安全代码

来源:互联网 发布:蓝月传奇附灵数据 编辑:程序博客网 时间:2024/06/06 07:39
clear all
clc
A=zeros(3,5);%生成一个三行五列的零矩阵
for i=1:3
    for j=1:5
        temp=fix(rand(1)*100);%各元素取值为0-100之间的整数
        A(i,j)=temp;
    end
end
A
tmp=[];%生成一个临时空数组
tmp=sum(A,2);%空数组的取值为矩阵的各行的行元素之和
for i=1:3
    for j=1:5
        temp=A(i,j)/tmp(i);%对矩阵进行归一化处理,使得矩阵每一行行和为1
        A(i,j)=temp;
    end
end
A


x=-10:1:10;%x的取值,从-10到10以步长为1增长
y=abs(x+1)+abs(x-1);%y与x的关系
plot(x,y);%画图


%%%%%%%%%%%%%%%%%%%信源模型%%%%%%%%%%%%%%%%%
%生成含4个随机概率数的数组
a=rand(1,4)
%归一化数组使和为1
for i=1:4
    b(i)=a(i)/sum(a);
end
%输出数组
b


%设信源符号0或1的概率为p,则另一个符号的概率为1-p
%用机器零阀值eps代替0,以防log2(0)计算出错
p=eps:0.001:1-eps;
%定义计算二进制熵函数
h=-p.*log2(p)-(1-p).*log2(1-p);
%制作二进制熵函数曲线
plot(p,h);
title('二进制熵函数曲线');
xlabel('p');
ylabel('H(p,1-p)');
grid on


%%%%%%%%%%%%%%%整数和小数二进制十进制转换代码%%%%%%%%%%%%%%%%%
%打开文本文件
fid=fopen('Types of Speech.txt');
%读取文本文件
m=fread(fid);
%计算文本长度
cd=length(m);
%初始化26个字母频数为0
count=zeros(1,26);
%计算文本中26个字母的频数,存放于count数组中
for i=1:cd
    for j=0:25
        if m(i)==char(65+j) | m(i)==char(97+j)
            count(j+1)=count(j+1)+1;
        end
    end
end
%输出26个字母频数
count
%计算26个字母频数总和
total=sum(count);
%计算26个字母频率
freq=count/total
%初始化26个字母的信源熵为0
H=0;
%因为第26个字母z的概率为0,计算不出第26个字母的信息量I=-freq(26)*log2(freq(26)),所以用


freq(26)=eps代替0
freq(26)=eps;
%计算26个字母的信源熵
for i=1:26
    H=-freq(i).*log2(freq(i))+H;
end
%输出信源熵
H


%%%%%%%%%%%%%%整数和小数二进制十进制转换代码%%%%%%%%%%%%%%%%%
clc
clear all
flag=0;
tmp=[];
mtp=0;
disp('请输入一个小于1的十进制数')
n=input('');%输入一个小于1的十进制小数
n1=n;
disp('请确定十进制小数转换为二进制小数的位数')
m=input('');%控制十进制小数转换为二进制小数的位数
while flag<m && n1~=0
    %乘2取整,顺序排列
    n1=2*n1;
    if n1>=1
        n1=n1-1;
        tmp=[tmp,1];
    else
        n1=n1;
        tmp=[tmp,0];
    end
    flag=flag+1;%控制二进制小数的精度
end
tmp;
for i=1:m
    mtp=mtp+tmp(i)*10^(-i);
end
disp('二进制表示为:')
digits(m)
vpa(mtp)
N=0;
for i=1:m
    N=N+tmp(i)*2^(-i);
end
disp('二进制转换成十进制为:')
N
disp('误差为:')
err=(n-N)/n%误差


clc
clear all
flag=0;
emp=[];
tmp=[];
mtp=0;
Mtp=0;
disp('请输入一个十进制数')
n=input('');%输入一个十进制数
disp('请确定十进制小数转换为二进制小数的位数')
m=input('');%控制十进制小数转换为二进制小数的位数
n1=fix(n);%保留整数部分
n2=n-n1;%保留小数部分
%将整数部分用二进制表示
while n1~=0
    %除2取余,逆序排列
     p=mod(n1,2);
     emp=[emp,p];
    n1=fix(n1/2); 
end
emp=fliplr(emp);
for i=1:length(emp)
    Mtp=Mtp+emp(i)*10^(length(emp)-i);
end
disp('整数部分二进制表示为:')
Mtp
%将小数部分用二进制表示
while flag<m && n2~=0
    %乘2取整,顺序排列
    n2=2*n2;
    if n2>=1
        n2=n2-1;
        tmp=[tmp,1];
    else
        n2=n2;
        tmp=[tmp,0];
    end
    flag=flag+1;%控制二进制小数的精度
end
tmp;
for i=1:m
    mtp=mtp+tmp(i)*10^(-i);
end
disp('小数部分表示为:')
digits(m)
vpa(mtp)
%输出二进制数
M=Mtp+mtp;
digits(m+length(emp));
disp('二进制表示为:')
vpa(M)


%%%%%%%%%%%%%%香农编码代码%%%%%%%%%%%%%%%%%
%基础实验
%%
clear all
clc
%打开文本文件
fid=fopen('Types of Speech.txt');
%读取文本文件
m=fread(fid);
%计算文本长度
cd=length(m);
%初始化26个字母频数为0
count=zeros(1,26);
%计算文本中26个字母的频数,存放于count数组中
for i=1:cd
    for j=0:25
        if m(i)==char(65+j) | m(i)==char(97+j)
            count(j+1)=count(j+1)+1;
        end
    end
end
%输出26个字母频数
count
%计算26个字母频数总和
total=sum(count)
%计算前25个字母频率
count=count(1:25)
freq=count/total
tofreq=sum(freq)
%计算前25个字母的信源熵
H=0;
for i=1:25
    H=-freq(i).*log2(freq(i))+H;
end
%输出信源熵
H


%未降序排列,后续计算需用到
freq1=freq;
%求概率的-log2值
for i=1:25
    log_freq1(i)=-log2(freq1(i));
end
%求码长
machang1=ceil(log_freq1);




%降序排列
freq=fliplr(sort(freq));
%求概率的-log2值
for i=1:25
    log_freq(i)=-log2(freq(i));
end
%求码长
machang=ceil(log_freq);
%求累加概率
sum_freq(1)=0;
for i=2:25
    sum_freq(i)=freq(i-1)+sum_freq(i-1);
end
%计算码字
x=sum_freq;
for i=1:25
    k=0;
    a='';
while k<machang(i)
temp1=2*x(i);
temp2=floor(temp1);
x(i)=temp1-temp2;
temp=num2str(temp2);
a=strcat(a,temp);
k=k+1;
end
b=sym(a);
c(i)=b;
end
c
%计算平均码长
K=sum(freq.*machang)
%计算编码效率
yita=H/K
%统计所有二进制数的字节数
bit=sum(machang1.*count)/8
%1个英文字母等于1字节,所有英文字母字节数等于其个数total
%计算压缩效率
comp=(total-bit)/total






%%%%%%%%%%%%%%哈夫曼编码代码%%%%%%%%%%%%%%%%%
clc
clear;
d=fopen('Types of Speech.txt','r');%打开文件
string=fread(d,inf,'char');
str=lower(char(string));%将上述文件中的所有英文字母化为小写字母
x=tabulate(str);
e=fopen('types.txt','w');
fwrite(e,str,'char');%将上述文件中的所有英文字母化为小写字母后写出到type文件
fclose(d);
fclose(e);
g=fopen('types.txt','r');%打开已经转换成小写字母文件
mtp=fread(g,'char');
num=mtp-'a';%将所有字符的ASCII码与字符‘a’的ASCII码相减
%统计26个字母的频数
for i=1:length(num)
    for j=1:26
        b(j)=sum(num==j-1);
    end
end
%统计26个字母的频率
s=sum(b);
for i=1:26
    c(i)=b(i)/s;
end
disp('26个字母出现的频率为:');
disp(c)
%将概率为0的信源符号剔除
for i=1:26
    if c(i)~=0
        k(i)=c(i);
    end
end
length(k);%统计信源符号个数
A=k;%信源概率序列
A=fliplr(sort(A));%按降序排列
T=A;
[m,n]=size(A);
B=zeros(n,n-1);%空的编码表(矩阵)
for i=1:n
    B(i,1)=T(i);%生成编码表的第一列
end
r=B(i,1)+B(i-1,1);%最后两个元素相加
T(n-1)=r;
T(n)=0;
T=fliplr(sort(T));
t=n-1;
for j=2:n-1%生成编码表的其他各列
    for i=1:t
        B(i,j)=T(i);
    end
        K=find(T==r);
        B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在该列的位置
        r=(B(t-1,j)+B(t,j));%最后两个元素相加
        T(t-1)=r;
        T(t)=0;
        T=fliplr(sort(T));
        t=t-1;
end
B%输出编码表
END1=sym('[0,1]');%给最后一列的元素编码
END=END1;
t=3;
d=1;
for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码
    for i=1:t-2
        if i>1 & B(i,j)==B(i-1,j)%判断是否有2个概率相同
            d=d+1;
        else
            d=1;
        end
        B(B(n,j+1),j+1)=-1;
        temp=B(:,j+1);%将第j+1列赋给临时列temp
        x=find(temp==B(i,j));%在临时列temp中找到B(i,j)在第j+1列的位置,如果有概率相同则


可能有多个
        END(i)=END1(x(d));%如果有概率相同则取概率相同,位置靠后的一个进行编码
    end
    y=B(n,j+1);%取每列的最后一个元素,特征元素,即合并元素
    END(t-1)=[char(END1(y)),'0'];%两个概率中小的那个分配给0
    END(t)=[char(END1(y)),'1'];%两个概率中大的那个分配给1
    t=t+1;
    END1=END;
end
    A%排序后的原概率序列
    disp('编码结果')
    END%编码结果
%获取信源符号的编码码长
for i=1:n
    [a,b]=size(char(END(i)));
    L(i)=b;
end
L;%各个信源符号的码长
disp('平均码长');
avlen=sum(L.*A)%平均码长
rt=A(1:end);
H1=log2(rt);
disp('熵')
H=-rt*(H1')%熵
disp('编码效率')
P=H/avlen%编码效率
disp('压缩率')
u=(sum(L.*A)*s)/(s*8)
%%%%%%%%%%%%%%拓展实验代码%%%%%%%%%%%%%%%%%
clc
clear;
d=fopen('Types of Speech.txt','r');%打开文件
string=fread(d,inf,'char');
str=lower(char(string));%将上述文件中的所有英文字母化为小写字母
x=tabulate(str);
e=fopen('types.txt','w');
fwrite(e,str,'char');%将上述文件中的所有英文字母化为小写字母后写出到type文件
fclose(d);
fclose(e);
g=fopen('types.txt','r');%打开已经转换成小写字母文件
mtp=fread(g,'char');
x=tabulate(mtp);
[m1,n1] = size(x);
char(x(32:end,1));%从空格的ASCII码开始到小写字母z
fprintf('       char     n         rate\n');
j=1;
s=0;
for i=32:m1
    a=char(x(i,1));
    b=x(i,2);
    c=x(i,3);
    s=s+b;
    if c~=0
    fprintf('%12s %10.5f %10.5f\n',a,b,c);
    end
end
s;%出现的字符数量总和
for i=1:90
    myp(i)=x(31+i,3);
end
sum(myp);
myp=myp/100;
A=myp%原概率序列
A=fliplr(sort(A));%按降序排列
k=[];
for i=1:90
    if A(i)~=0
        k=[k,A(i)];
    end
end
A=k;
T=A;
[m,n]=size(A);
B=zeros(n,n-1);%空的编码表(矩阵)
for i=1:n
    B(i,1)=T(i);%生成编码表的第一列
end
r=B(i,1)+B(i-1,1);%最后两个元素相加
T(n-1)=r;
T(n)=0;
T=fliplr(sort(T));
t=n-1;
for j=2:n-1%生成编码表的其他各列
    for i=1:t
        B(i,j)=T(i);
    end
        K=find(T==r);
        B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在该列的位置
        r=(B(t-1,j)+B(t,j));%最后两个元素相加
        T(t-1)=r;
        T(t)=0;
        T=fliplr(sort(T));
        t=t-1;
end
B%输出编码表
END1=sym('[0,1]');%给最后一列的元素编码
END=END1;
t=3;
d=1;
for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码
    for i=1:t-2
        if i>1 & B(i,j)==B(i-1,j)%判断是否有2个概率相同
            d=d+1;
        else
            d=1;
        end
        B(B(n,j+1),j+1)=-1;
        temp=B(:,j+1);%将第j+1列赋给临时列temp
        x=find(temp==B(i,j));%在临时列temp中找到B(i,j)在第j+1列的位置,如果有概率相同则


可能有多个
        END(i)=END1(x(d));%如果有概率相同则取概率相同,位置靠后的一个进行编码
    end
    y=B(n,j+1);%取每列的最后一个元素,特征元素,即合并元素
    END(t-1)=[char(END1(y)),'0'];%两个概率中小的那个分配给0
    END(t)=[char(END1(y)),'1'];%两个概率中大的那个分配给1
    t=t+1;
    END1=END;
end
    A%排序后的原概率序列
    disp('编码结果')
    END%编码结果
%获取信源符号的编码码长
for i=1:n
    [a,b]=size(char(END(i)));
    L(i)=b;
end
L;%各个信源符号的码长
disp('平均码长');
avlen=sum(L.*A)%平均码长
rt=A(1:end);
H1=log2(rt);
disp('熵')
H=-rt*(H1')%熵
disp('编码效率')
P=H/avlen%编码效率
disp('压缩率')
u=(sum(L.*A)*s)/(s*8)%压缩率


%%%%%%%%%%%%%%%%凯撒加解密算法%%%%%%%%%%%%%%%%%%
function Y=CaesarCode(X,K,T)
%其中X表示明文,K表示密钥,T表示加密或解密(规定当T=1时为加密,T=2时为解密)
word=['z','a','b','c','d','e','f','g','h','i','j','k','l','m','n',...
      'o','p','q','r','s','t','u','v','w','x','y'];
WORD=['Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N',...
      'O','P','Q','R','S','T','U','V','W','X','Y'];
%由于MATLAB的数组下标是从1开始的,而密文得到z是取余数为0的结果,所以将z放到第1位
L=length(X);%获取明文的长度
for i=1:L
    emp=abs(X(i));%获取明文对应的ASCII码
    if emp>=97 & emp<=123 %对小写字母进行处理,小写字母a到z的ASCII码是97~123,加密的内容


是26个小写字母,判断是否需要加密
      for j=1:26
          if X(i)==word(j)%判断是哪一个小写字母
              if T==1 %加密的过程
              n=mod(j+K-1,26);%由于是从z开始而不是从a开始所以要减1才是真正移动的位数
              Y(i)=word(n+1);%加密得到的密文
              else %解密的过程是加密过程的逆过程
              n=mod(j-K-1,26);%由于是从z开始而不是从a开始所以要减1才是真正移动的位数
              Y(i)=word(n+1);%解密得到明文
              end
          end
      end
    elseif emp>=65 & emp<=90%对大写字母进行处理,大写字母A到Z的ASCII码是65~90,加密的内


容是26个大写字母,判断是否需要加密
        for j=1:26
          if X(i)==WORD(j)%判断是哪一个大写字母
              if T==1 %加密的过程
              n=mod(j+K-1,26);%由于是从Z开始而不是从A开始所以要减1才是真正移动的位数
              Y(i)=WORD(n+1);%加密得到的密文
              else %解密的过程是加密过程的逆过程
              n=mod(j-K-1,26);%由于是从Z开始而不是从A开始所以要减1才是真正移动的位数
              Y(i)=WORD(n+1);%解密得到明文
              end
          end
      end
    else%对非字母的处理是保持不变,即对标点和空格等其他字符保持原状
        Y(i)=X(i);
    end
end
%%%%%%%%%小写字母的加解密(大写当作小写字母处理)%%%%%%%%%%%%%%
clc
clear all
d=fopen('Types of Speech.txt','r');%打开文件
string=fread(d,inf,'char');
str=lower(char(string));%将上述文件中的所有大写英文字母化为小写字母
e=fopen('types.txt','w');
fwrite(e,str,'char');%将上述文件中的所有英文字母化为小写字母后写出到type文件
fclose(d);
fclose(e);
g=fopen('types.txt','r');%打开已经转换成小写字母文件
mtp=fread(g,'char');
Y=CaesarCode(mtp,3,1)%调用CaesarCode函数加密
f=fopen('OK.txt','w');
fwrite(f,Y,'char');%输出密文OK.txt文件
fclose(f);
v=fopen('OK.txt','r');%打开加密文本OK.txt
mpt=fread(v,'char');
num=mpt-'a';%将所有字符的ASCII码与字符‘a’的ASCII码相减
%统计26个字母的频数
for i=1:length(num)
    for j=1:26
        b(j)=sum(num==j-1);
    end
end
%统计26个字母的频率
s=sum(b);
for i=1:26
    c(i)=b(i)/s;
end
disp('密文中26个字母出现的频率为:');
disp(c)
a=['a','b','c','d','e','f','g','h','i','j','k','l','m','n',...
      'o','p','q','r','s','t','u','v','w','x','y','z'];
bar(1:26,c)
set(gca,'xtick',[1:26],'xticklabel',a')
xlabel('字母');
ylabel('频率');
title('频率分析直方图')
temp=0;
%求出密文中最大频率的下标
for i=1:26
    if c(i)>temp
        temp=c(i);
        flag=i;
    end
end
flag;
%从频率分析法求密钥
if flag<5%以e为界限分情况讨论密钥,其中5是字母表e的位置
    key=flag+26-5;
else
    key=flag-5;
end
disp('加密的密钥是:');
disp(key);
X=CaesarCode(Y,key,2)%调用CaesarCode函数解密
%%%%%%%%%%%%%%%%拓展到大写字母的加解密%%%%%%%%%%%%%%%%
clc
clear;
d=fopen('Types of Speech.txt','r');%打开文件
mtp=fread(d,'char');
Y=CaesarCode(mtp,3,1)%调用CaesarCode函数加密
f=fopen('OK.txt','w');
fwrite(f,Y,'char');%输出密文OK.txt文件
fclose(f);
v=fopen('OK.txt','r');%打开加密文本OK.txt
mpt=fread(v,'char');
str=lower(char(mpt));%将上述文件中的所有大写英文字母化为小写字母
num=mpt-'a';%将所有字符的ASCII码与字符‘a’的ASCII码相减
%统计26个字母的频数
for i=1:length(num)
    for j=1:26
        b(j)=sum(num==j-1);
    end
end
%统计26个字母的频率
s=sum(b);
for i=1:26
    c(i)=b(i)/s;
end
disp('密文中26个字母出现的频率为:');
disp(c)
a=['a','b','c','d','e','f','g','h','i','j','k','l','m','n',...
      'o','p','q','r','s','t','u','v','w','x','y','z'];
bar(1:26,c)
set(gca,'xtick',[1:26],'xticklabel',a')
xlabel('字母');
ylabel('频率');
title('频率分析直方图')
temp=0;
%求出密文中最大频率的下标
for i=1:26
    if c(i)>temp
        temp=c(i);
        flag=i;
    end
end
flag;
%从频率分析法求密钥
if flag<5%以e为界限分情况讨论密钥,其中5是字母表e的位置
    key=flag+26-5;
else
    key=flag-5;
end
disp('加密的密钥是:');
disp(key);
X=CaesarCode(Y,key,2)%调用CaesarCode函数解密


%%%%%%%%%%%%%%%%%%%%信息隐藏实验%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=im2bin(x)
%此函数将二值图像转换为一维的二进制的比特串,参数x表示输入的二值图像
xd=double(x);
xs=size(x);
hang=xs(1);
lie=xs(2);
for i=1:hang
    for j=1:lie
        y((i-1)*lie+j)=xd(i,j);
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=bin2im(x,m,n)%此函数将二进制比特串x转换成m*n的二值图像
for i=1:m
    for j=1:n
        yd(i,j)=x((i-1)*n+j);
    end
end
y=yd;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=numbin2dec(x)%将二进制数转换为十进制数
a=0;
lx=length(x);
for i=1:lx    
    a=a+x(i)*2^(lx-i); %乘2取整,顺序排列
end
y=a;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function y=numdec2bin(x,n)%从函数将十进制


数x转化为n位二进制
y=zeros(1,n);
a=x;
i=n;
while a>0   
    y(i)=mod(a,2);%取余数   
    a=floor(a/2);%取商(floor函数是取比它小的整数,即朝负无穷方向取整)
    i=i-1;%逆序
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=LSB(c,m,n)
%参数说明:c表示载体图像,m表示秘密信息,n表示在8层结构中最低的n层进行隐藏
function y=LSB(c,m,n)
%参数说明:c表示载体图像,m表示秘密信息,n表示在8层结构中最低的n层进行隐藏
cd=double(c);%返回与矩阵c数值相同但类型为double的矩阵
cs=size(c);%获取矩阵c的行数和列数
hangc=cs(1);%获取矩阵c的行数
liec=cs(2);%获取矩阵c列数
mbin=im2bin(m);%将二值图像转换为一维的二进制的比特串
lm=length(mbin);%返回数组mbin的长度(即行数或列数中的较大值)
for i=1:n:lm-n+1%将秘密信息按位隐藏入连续的像素中
    t=numdec2bin(cd(ceil(i/liec/n),ceil(i/n)-(ceil(i/liec/n)-1)*liec),8);%选取要隐藏信息


的像素
    t(9-n:8)=mbin(i:i+n-1);
    cd(ceil(i/liec/n),ceil(i/n)-(ceil(i/liec/n)-1)*liec)=numbin2dec(t);%将秘密信息存入选


取的像素点
end
y=uint8(cd);%以uint8(8位无符号整数)方式存储图像,称作8位图像,节省存储空间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=reLSB(x,m,n)
%此函数实现LSB算法的提取过程,参数x表示伪装图像
%参数m表示提取水印图片的行数,参数n表示提取水印图片的列数
xd=double(x);%返回与矩阵x数值相同但类型为double的矩阵
xs=size(x);%获取矩阵c的行数和列数
hang=xs(1);%获取矩阵c的行数
lie=xs(2);%获取矩阵c列数
l=m*n;
for i=1:l
    yd(i)=bitget(xd(ceil(i/lie),i-(ceil(i/lie)-1)*lie),1);%根据秘密信息的隐藏位置,恢复秘


密信息
end 
y=bin2im(yd,m,n);%将二进制比特串yd转换成m*n的二值图像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all
close all
c=imread('a1.jpg');%读入载体信息
m=imread('a2.bmp');%读取秘密信息
ms=size(m);%获取矩阵m的行数和列数
s=LSB(c,m,1);%利用LSB算法隐藏信息
imwrite(s,'inwatermarking.tif','Compression','none');%生成嵌入信息图像
watermarkingnew=reLSB(s,ms(1),ms(2));%提取秘密信息
imshow(watermarkingnew)
imwrite(watermarkingnew,'watermarkingnew.tif','Compression','none');%秘密信息生成水印图



subplot(2,2,1)%展示载体图像
imshow(c)
title('载体图像')
subplot(2,2,2)%展示伪装图像
imshow(s)
title('伪装图像')
subplot(2,2,3)%展示隐藏图像
imshow(m)
title('隐藏图像')
subplot(2,2,4)%展示秘密信息
imshow(watermarkingnew)
title('秘密信息')

原创粉丝点击